{
  "openapi": "3.1.0",
  "info": {
    "title": "WISEPIM Public API",
    "version": "1.0.0",
    "description": "Read and update your WisePIM catalogue from your own systems. Authenticate with `Authorization: Bearer wpk_…`; create keys under Settings → API keys. Each key is bound to one project and to the scopes it was created with.",
    "summary": "Read and update a WISEPIM project's products, categories and attributes from your own systems.",
    "termsOfService": "https://wisepim.com/terms",
    "contact": {
      "name": "WISEPIM support",
      "url": "https://wisepim.com/contact",
      "email": "info@wisepim.com"
    },
    "x-logo": {
      "url": "https://docs.wisepim.com/logo/wisepim-logo-horizontal-transparant-lightmode.png",
      "altText": "WISEPIM"
    }
  },
  "paths": {
    "/api/public/v1/me": {
      "get": {
        "operationId": "public_v1_get_me",
        "summary": "Describe the calling key",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MeOut"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          }
        },
        "description": "The key this request authenticated with and the project it is bound to.\n\nNeeds no scope: an integration calls it to confirm which credential it is\nholding, which scopes that credential carries, and which project every\nother call will land in. The secret itself is never returned — only its\ndisplay prefix.",
        "tags": [
          "Key and project"
        ],
        "security": [
          {
            "ProjectApiKeyAuth": []
          }
        ],
        "x-required-scopes": []
      }
    },
    "/api/public/v1/project": {
      "get": {
        "operationId": "public_v1_get_project",
        "summary": "Read the project",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectOut"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          }
        },
        "description": "The project the key is bound to: identity, status, locales, industry\nand the live product count. Requires `project:read`.",
        "tags": [
          "Key and project"
        ],
        "security": [
          {
            "ProjectApiKeyAuth": []
          }
        ],
        "x-required-scopes": [
          "project:read"
        ]
      }
    },
    "/api/public/v1/products": {
      "get": {
        "operationId": "public_v1_list_products",
        "summary": "List products",
        "parameters": [
          {
            "in": "query",
            "name": "ids",
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Ids"
            },
            "required": false
          },
          {
            "in": "query",
            "name": "skus",
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Skus"
            },
            "required": false
          },
          {
            "in": "query",
            "name": "updated_since",
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Updated Since"
            },
            "required": false
          },
          {
            "in": "query",
            "name": "category_id",
            "schema": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Category Id"
            },
            "required": false
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Status"
            },
            "required": false
          },
          {
            "in": "query",
            "name": "product_type",
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Product Type"
            },
            "required": false
          },
          {
            "in": "query",
            "name": "parent_id",
            "schema": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Parent Id"
            },
            "required": false
          },
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Cursor"
            },
            "required": false
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Limit"
            },
            "required": false
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductPageOut"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorOut"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          }
        },
        "description": "The project's products, keyset-paged by id (`limit` ≤ 200).\n\nBulk lookup: `ids` or `skus` (comma-separated, up to 200 each).\nIncremental sync: `updated_since` (ISO-8601) returns products modified\nat or after that instant — page until `has_more` is false, then store\nthe highest `updated_at` you saw. Further filters: `category_id`\n(direct membership), `status`, `product_type`, `parent_id`\n(variants of a configurable product). Requires `products:read`.",
        "tags": [
          "Products"
        ],
        "security": [
          {
            "ProjectApiKeyAuth": []
          }
        ],
        "x-required-scopes": [
          "products:read"
        ]
      },
      "post": {
        "operationId": "public_v1_create_product",
        "summary": "Create a product",
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[!-~]+$"
            },
            "description": "Optional. Send the same key on every retry of one write (same method, path, query and JSON body) and the API replays the original status and body instead of applying the change again. Keys are scoped to the calling API key and kept until that key is deleted. Reusing a key for a different request returns 409 `idempotency_conflict`; a key that is not 1-128 printable ASCII characters without whitespace returns 422 `invalid_idempotency_key`."
          }
        ],
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductOut"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorOut"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          }
        },
        "description": "Create one product. `sku` is required and must be unique within the\nproject (409 `sku_conflict`). Every other field is optional; see the\nschema for the writable set — `main_image`, `product_type` and\n`parent` are not writable here. `category_ids` must belong to this\nproject and `attributes` keys must be attribute codes of this project\n(422 `unknown_category` / `unknown_attribute`). Creating a product\nthe owner's plan has no room for is a 403 `product_limit_exceeded`.\nRequires `products:write`.",
        "tags": [
          "Products"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductCreateIn"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ProjectApiKeyAuth": []
          }
        ],
        "x-required-scopes": [
          "products:write"
        ]
      }
    },
    "/api/public/v1/products/{product_id}": {
      "get": {
        "operationId": "public_v1_get_product",
        "summary": "Read one product",
        "parameters": [
          {
            "in": "path",
            "name": "product_id",
            "schema": {
              "title": "Product Id",
              "type": "integer"
            },
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductOut"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorOut"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          }
        },
        "description": "One product with its attribute values and category ids. A product\noutside this project is a 404, never a 403. Requires `products:read`.",
        "tags": [
          "Products"
        ],
        "security": [
          {
            "ProjectApiKeyAuth": []
          }
        ],
        "x-required-scopes": [
          "products:read"
        ]
      },
      "patch": {
        "operationId": "public_v1_update_product",
        "summary": "Update a product",
        "parameters": [
          {
            "in": "path",
            "name": "product_id",
            "schema": {
              "title": "Product Id",
              "type": "integer"
            },
            "required": true
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[!-~]+$"
            },
            "description": "Optional. Send the same key on every retry of one write (same method, path, query and JSON body) and the API replays the original status and body instead of applying the change again. Keys are scoped to the calling API key and kept until that key is deleted. Reusing a key for a different request returns 409 `idempotency_conflict`; a key that is not 1-128 printable ASCII characters without whitespace returns 422 `invalid_idempotency_key`."
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductOut"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorOut"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          }
        },
        "description": "Partial update: only the fields present in the body change. `sku`\nis not writable (it is the product's stable identity for integrations);\nneither are `product_type`, `parent`, `main_image` or system\nfields — sending one is a 422. `category_ids` replaces the category\nset; `attributes` touches only the codes sent (`null` removes a\nvalue). A no-op body returns the unchanged product. Requires\n`products:write`.",
        "tags": [
          "Products"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductUpdateIn"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ProjectApiKeyAuth": []
          }
        ],
        "x-required-scopes": [
          "products:write"
        ]
      }
    },
    "/api/public/v1/products/batch": {
      "post": {
        "operationId": "public_v1_batch_upsert_products",
        "summary": "Create or update up to 200 products by SKU",
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[!-~]+$"
            },
            "description": "Optional. Send the same key on every retry of one write (same method, path, query and JSON body) and the API replays the original status and body instead of applying the change again. Keys are scoped to the calling API key and kept until that key is deleted. Reusing a key for a different request returns 409 `idempotency_conflict`; a key that is not 1-128 printable ASCII characters without whitespace returns 422 `invalid_idempotency_key`."
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductBatchOut"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BatchErrorOut"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          }
        },
        "description": "Upsert keyed by `sku`: items whose SKU exists are updated, the rest\nare created. The batch is validated first and applied atomically — a\nduplicate SKU within the batch, an unknown category or attribute, an\ninvalid value or more creates than the plan allows returns 422\n`batch_invalid` with one entry per offending item and **nothing is\nwritten**. On success every item is applied in one transaction and the\nresponse lists each item's `id` and whether it was `created` or\n`updated`. Retrying the same batch is idempotent. Requires\n`products:write`.",
        "tags": [
          "Products"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductBatchIn"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ProjectApiKeyAuth": []
          }
        ],
        "x-required-scopes": [
          "products:write"
        ]
      }
    },
    "/api/public/v1/categories": {
      "get": {
        "operationId": "public_v1_list_categories",
        "summary": "List categories",
        "parameters": [
          {
            "in": "query",
            "name": "ids",
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Ids"
            },
            "required": false
          },
          {
            "in": "query",
            "name": "parent_id",
            "schema": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Parent Id"
            },
            "required": false
          },
          {
            "in": "query",
            "name": "is_active",
            "schema": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Is Active"
            },
            "required": false
          },
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Cursor"
            },
            "required": false
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Limit"
            },
            "required": false
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CategoryPageOut"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorOut"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          }
        },
        "description": "The project's categories, keyset-paged by id, flat with `parent_id`\nand `level` so a client can rebuild the tree. `parent_id=0` selects\nthe roots; `ids` is a comma-separated bulk lookup; `is_active`\nfilters on the flag. Requires `categories:read`.",
        "tags": [
          "Categories"
        ],
        "security": [
          {
            "ProjectApiKeyAuth": []
          }
        ],
        "x-required-scopes": [
          "categories:read"
        ]
      }
    },
    "/api/public/v1/categories/{category_id}": {
      "get": {
        "operationId": "public_v1_get_category",
        "summary": "Read one category",
        "parameters": [
          {
            "in": "path",
            "name": "category_id",
            "schema": {
              "title": "Category Id",
              "type": "integer"
            },
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CategoryOut"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorOut"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          }
        },
        "description": "One category. A category outside this project is a 404. Requires `categories:read`.",
        "tags": [
          "Categories"
        ],
        "security": [
          {
            "ProjectApiKeyAuth": []
          }
        ],
        "x-required-scopes": [
          "categories:read"
        ]
      }
    },
    "/api/public/v1/attributes": {
      "get": {
        "operationId": "public_v1_list_attributes",
        "summary": "List attribute definitions",
        "parameters": [
          {
            "in": "query",
            "name": "ids",
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Ids"
            },
            "required": false
          },
          {
            "in": "query",
            "name": "codes",
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Codes"
            },
            "required": false
          },
          {
            "in": "query",
            "name": "group_id",
            "schema": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Group Id"
            },
            "required": false
          },
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Cursor"
            },
            "required": false
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Limit"
            },
            "required": false
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttributePageOut"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorOut"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          }
        },
        "description": "The project's attribute definitions, keyset-paged by id. `ids` and\n`codes` are comma-separated bulk lookups; `group_id` restricts to\none attribute group. Requires `attributes:read`.",
        "tags": [
          "Attributes"
        ],
        "security": [
          {
            "ProjectApiKeyAuth": []
          }
        ],
        "x-required-scopes": [
          "attributes:read"
        ]
      }
    },
    "/api/public/v1/attributes/{attribute_id}": {
      "get": {
        "operationId": "public_v1_get_attribute",
        "summary": "Read one attribute definition",
        "parameters": [
          {
            "in": "path",
            "name": "attribute_id",
            "schema": {
              "title": "Attribute Id",
              "type": "integer"
            },
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttributeOut"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorOut"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOut"
                }
              }
            }
          }
        },
        "description": "One attribute definition. An attribute outside this project is a 404. Requires `attributes:read`.",
        "tags": [
          "Attributes"
        ],
        "security": [
          {
            "ProjectApiKeyAuth": []
          }
        ],
        "x-required-scopes": [
          "attributes:read"
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "KeyOut": {
        "description": "The credential the request authenticated with. Never the secret.",
        "properties": {
          "id": {
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "key_prefix": {
            "title": "Key Prefix",
            "type": "string"
          },
          "scopes": {
            "items": {
              "type": "string"
            },
            "title": "Scopes",
            "type": "array"
          },
          "rate_limit_per_minute": {
            "title": "Rate Limit Per Minute",
            "type": "integer"
          },
          "expires_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expires At"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "last_used_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Used At"
          }
        },
        "required": [
          "id",
          "name",
          "key_prefix",
          "scopes",
          "rate_limit_per_minute",
          "created_at"
        ],
        "title": "KeyOut",
        "type": "object"
      },
      "MeOut": {
        "properties": {
          "key": {
            "$ref": "#/components/schemas/KeyOut"
          },
          "project": {
            "$ref": "#/components/schemas/ProjectSummaryOut"
          }
        },
        "required": [
          "key",
          "project"
        ],
        "title": "MeOut",
        "type": "object"
      },
      "ProjectSummaryOut": {
        "properties": {
          "id": {
            "title": "Id",
            "type": "integer"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "primary_locale": {
            "title": "Primary Locale",
            "type": "string"
          },
          "available_locales": {
            "items": {
              "type": "string"
            },
            "title": "Available Locales",
            "type": "array"
          }
        },
        "required": [
          "id",
          "name",
          "primary_locale",
          "available_locales"
        ],
        "title": "ProjectSummaryOut",
        "type": "object"
      },
      "ErrorOut": {
        "description": "The shared error envelope every NinjaAPI instance renders.\n\n`code` is present for :class:`user_app.ninja_api.errors.ApiError`\n(`insufficient_scope`, `rate_limited`, `invalid_cursor`, …) so machine\nclients can branch without parsing `error`.",
        "properties": {
          "error": {
            "title": "Error",
            "type": "string"
          },
          "code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Code"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          }
        },
        "required": [
          "error",
          "request_id"
        ],
        "title": "ErrorOut",
        "type": "object"
      },
      "ProjectOut": {
        "properties": {
          "id": {
            "title": "Id",
            "type": "integer"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "status": {
            "title": "Status",
            "type": "string"
          },
          "primary_locale": {
            "title": "Primary Locale",
            "type": "string"
          },
          "available_locales": {
            "items": {
              "type": "string"
            },
            "title": "Available Locales",
            "type": "array"
          },
          "primary_industry": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Primary Industry"
          },
          "product_count": {
            "title": "Product Count",
            "type": "integer"
          },
          "created_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created At"
          }
        },
        "required": [
          "id",
          "name",
          "status",
          "primary_locale",
          "available_locales",
          "product_count"
        ],
        "title": "ProjectOut",
        "type": "object"
      },
      "AttributeValueOut": {
        "properties": {
          "code": {
            "title": "Code",
            "type": "string"
          },
          "label": {
            "title": "Label",
            "type": "string"
          },
          "type": {
            "title": "Type",
            "type": "string"
          },
          "value": {
            "title": "Value"
          },
          "unit": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Unit"
          }
        },
        "required": [
          "code",
          "label",
          "type"
        ],
        "title": "AttributeValueOut",
        "type": "object"
      },
      "FamilyRefOut": {
        "properties": {
          "id": {
            "title": "Id",
            "type": "integer"
          },
          "code": {
            "title": "Code",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "id",
          "code",
          "name"
        ],
        "title": "FamilyRefOut",
        "type": "object"
      },
      "ProductOut": {
        "properties": {
          "id": {
            "title": "Id",
            "type": "integer"
          },
          "sku": {
            "title": "Sku",
            "type": "string"
          },
          "ean": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ean"
          },
          "upc": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Upc"
          },
          "manufacturer_part_number": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Manufacturer Part Number"
          },
          "brand": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Brand"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "name_long": {
            "title": "Name Long",
            "type": "string"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "short_description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Short Description"
          },
          "name_localized": {
            "additionalProperties": true,
            "title": "Name Localized",
            "type": "object"
          },
          "description_localized": {
            "additionalProperties": true,
            "title": "Description Localized",
            "type": "object"
          },
          "short_description_localized": {
            "additionalProperties": true,
            "title": "Short Description Localized",
            "type": "object"
          },
          "status": {
            "title": "Status",
            "type": "string"
          },
          "product_type": {
            "title": "Product Type",
            "type": "string"
          },
          "parent_id": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Parent Id"
          },
          "family": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FamilyRefOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "price": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Decimal string, e.g. \"19.99\".",
            "title": "Price"
          },
          "special_price": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Decimal string, e.g. \"14.99\".",
            "title": "Special Price"
          },
          "special_price_start_date": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Special Price Start Date"
          },
          "special_price_end_date": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Special Price End Date"
          },
          "main_image": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Main Image"
          },
          "meta_title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Meta Title"
          },
          "meta_description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Meta Description"
          },
          "meta_keywords": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Meta Keywords"
          },
          "category_ids": {
            "items": {
              "type": "integer"
            },
            "title": "Category Ids",
            "type": "array"
          },
          "attributes": {
            "items": {
              "$ref": "#/components/schemas/AttributeValueOut"
            },
            "title": "Attributes",
            "type": "array"
          },
          "version": {
            "title": "Version",
            "type": "integer"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "sku",
          "name",
          "name_long",
          "name_localized",
          "description_localized",
          "short_description_localized",
          "status",
          "product_type",
          "category_ids",
          "attributes",
          "version",
          "created_at",
          "updated_at"
        ],
        "title": "ProductOut",
        "type": "object"
      },
      "ProductPageOut": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/ProductOut"
            },
            "title": "Data",
            "type": "array"
          },
          "next_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Cursor"
          },
          "has_more": {
            "title": "Has More",
            "type": "boolean"
          }
        },
        "required": [
          "data",
          "has_more"
        ],
        "title": "ProductPageOut",
        "type": "object"
      },
      "ValidationErrorOut": {
        "description": "HTTP 422: `detail` carries Ninja's per-field validation errors.",
        "properties": {
          "error": {
            "title": "Error",
            "type": "string"
          },
          "code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Code"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "detail": {
            "anyOf": [
              {
                "items": {
                  "additionalProperties": true,
                  "type": "object"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Detail"
          }
        },
        "required": [
          "error",
          "request_id"
        ],
        "title": "ValidationErrorOut",
        "type": "object"
      },
      "ProductCreateIn": {
        "additionalProperties": false,
        "properties": {
          "ean": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ean"
          },
          "upc": {
            "anyOf": [
              {
                "maxLength": 12,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Upc"
          },
          "manufacturer_part_number": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Manufacturer Part Number"
          },
          "brand": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Brand"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 500,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "name_long": {
            "anyOf": [
              {
                "maxLength": 500,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name Long"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "short_description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Short Description"
          },
          "name_localized": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "Locale code → name, e.g. {\"nl\": \"Boormachine\"}.",
            "title": "Name Localized"
          },
          "description_localized": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description Localized"
          },
          "short_description_localized": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Short Description Localized"
          },
          "status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "One of active, inactive, pending, archived.",
            "title": "Status"
          },
          "meta_title": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Meta Title"
          },
          "meta_description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Meta Description"
          },
          "meta_keywords": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Meta Keywords"
          },
          "price": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Decimal string with at most two decimals (\"19.99\") or an integer. Null clears it.",
            "title": "Price"
          },
          "special_price": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Decimal string with at most two decimals (\"14.99\") or an integer. Null clears it.",
            "title": "Special Price"
          },
          "special_price_start_date": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Special Price Start Date"
          },
          "special_price_end_date": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Special Price End Date"
          },
          "category_ids": {
            "anyOf": [
              {
                "items": {
                  "type": "integer"
                },
                "maxItems": 200,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Replaces the product's category set. Every id must belong to this project.",
            "title": "Category Ids"
          },
          "attributes": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "Attribute values keyed by attribute code. A value is a scalar or list, or {\"value\": ..., \"unit\": \"kg\"}; null removes the value. Only the codes sent are touched.",
            "title": "Attributes"
          },
          "sku": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Sku",
            "type": "string"
          }
        },
        "required": [
          "sku"
        ],
        "title": "ProductCreateIn",
        "type": "object"
      },
      "ProductUpdateIn": {
        "additionalProperties": false,
        "properties": {
          "ean": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ean"
          },
          "upc": {
            "anyOf": [
              {
                "maxLength": 12,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Upc"
          },
          "manufacturer_part_number": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Manufacturer Part Number"
          },
          "brand": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Brand"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 500,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "name_long": {
            "anyOf": [
              {
                "maxLength": 500,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name Long"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "short_description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Short Description"
          },
          "name_localized": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "Locale code → name, e.g. {\"nl\": \"Boormachine\"}.",
            "title": "Name Localized"
          },
          "description_localized": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description Localized"
          },
          "short_description_localized": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Short Description Localized"
          },
          "status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "One of active, inactive, pending, archived.",
            "title": "Status"
          },
          "meta_title": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Meta Title"
          },
          "meta_description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Meta Description"
          },
          "meta_keywords": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Meta Keywords"
          },
          "price": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Decimal string with at most two decimals (\"19.99\") or an integer. Null clears it.",
            "title": "Price"
          },
          "special_price": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Decimal string with at most two decimals (\"14.99\") or an integer. Null clears it.",
            "title": "Special Price"
          },
          "special_price_start_date": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Special Price Start Date"
          },
          "special_price_end_date": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Special Price End Date"
          },
          "category_ids": {
            "anyOf": [
              {
                "items": {
                  "type": "integer"
                },
                "maxItems": 200,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Replaces the product's category set. Every id must belong to this project.",
            "title": "Category Ids"
          },
          "attributes": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "Attribute values keyed by attribute code. A value is a scalar or list, or {\"value\": ..., \"unit\": \"kg\"}; null removes the value. Only the codes sent are touched.",
            "title": "Attributes"
          }
        },
        "title": "ProductUpdateIn",
        "type": "object"
      },
      "BatchResultItemOut": {
        "properties": {
          "index": {
            "title": "Index",
            "type": "integer"
          },
          "sku": {
            "title": "Sku",
            "type": "string"
          },
          "id": {
            "title": "Id",
            "type": "integer"
          },
          "action": {
            "description": "\"created\" or \"updated\".",
            "title": "Action",
            "type": "string"
          }
        },
        "required": [
          "index",
          "sku",
          "id",
          "action"
        ],
        "title": "BatchResultItemOut",
        "type": "object"
      },
      "BatchSummaryOut": {
        "properties": {
          "created": {
            "title": "Created",
            "type": "integer"
          },
          "updated": {
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "created",
          "updated"
        ],
        "title": "BatchSummaryOut",
        "type": "object"
      },
      "ProductBatchOut": {
        "properties": {
          "results": {
            "items": {
              "$ref": "#/components/schemas/BatchResultItemOut"
            },
            "title": "Results",
            "type": "array"
          },
          "summary": {
            "$ref": "#/components/schemas/BatchSummaryOut"
          }
        },
        "required": [
          "results",
          "summary"
        ],
        "title": "ProductBatchOut",
        "type": "object"
      },
      "BatchErrorItemOut": {
        "properties": {
          "index": {
            "title": "Index",
            "type": "integer"
          },
          "sku": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sku"
          },
          "code": {
            "title": "Code",
            "type": "string"
          },
          "message": {
            "title": "Message",
            "type": "string"
          }
        },
        "required": [
          "index",
          "code",
          "message"
        ],
        "title": "BatchErrorItemOut",
        "type": "object"
      },
      "BatchErrorOut": {
        "description": "HTTP 422 for `POST /products/batch`: nothing was written.",
        "properties": {
          "error": {
            "title": "Error",
            "type": "string"
          },
          "code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Code"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "errors": {
            "items": {
              "$ref": "#/components/schemas/BatchErrorItemOut"
            },
            "title": "Errors",
            "type": "array"
          }
        },
        "required": [
          "error",
          "request_id",
          "errors"
        ],
        "title": "BatchErrorOut",
        "type": "object"
      },
      "ProductBatchIn": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ProductUpsertIn"
            },
            "maxItems": 200,
            "minItems": 1,
            "title": "Items",
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "title": "ProductBatchIn",
        "type": "object"
      },
      "ProductUpsertIn": {
        "additionalProperties": false,
        "properties": {
          "ean": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ean"
          },
          "upc": {
            "anyOf": [
              {
                "maxLength": 12,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Upc"
          },
          "manufacturer_part_number": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Manufacturer Part Number"
          },
          "brand": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Brand"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 500,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "name_long": {
            "anyOf": [
              {
                "maxLength": 500,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name Long"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "short_description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Short Description"
          },
          "name_localized": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "Locale code → name, e.g. {\"nl\": \"Boormachine\"}.",
            "title": "Name Localized"
          },
          "description_localized": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description Localized"
          },
          "short_description_localized": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Short Description Localized"
          },
          "status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "One of active, inactive, pending, archived.",
            "title": "Status"
          },
          "meta_title": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Meta Title"
          },
          "meta_description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Meta Description"
          },
          "meta_keywords": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Meta Keywords"
          },
          "price": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Decimal string with at most two decimals (\"19.99\") or an integer. Null clears it.",
            "title": "Price"
          },
          "special_price": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Decimal string with at most two decimals (\"14.99\") or an integer. Null clears it.",
            "title": "Special Price"
          },
          "special_price_start_date": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Special Price Start Date"
          },
          "special_price_end_date": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Special Price End Date"
          },
          "category_ids": {
            "anyOf": [
              {
                "items": {
                  "type": "integer"
                },
                "maxItems": 200,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Replaces the product's category set. Every id must belong to this project.",
            "title": "Category Ids"
          },
          "attributes": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "Attribute values keyed by attribute code. A value is a scalar or list, or {\"value\": ..., \"unit\": \"kg\"}; null removes the value. Only the codes sent are touched.",
            "title": "Attributes"
          },
          "sku": {
            "description": "Upsert key within the project.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Sku",
            "type": "string"
          }
        },
        "required": [
          "sku"
        ],
        "title": "ProductUpsertIn",
        "type": "object"
      },
      "CategoryOut": {
        "properties": {
          "id": {
            "title": "Id",
            "type": "integer"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "slug": {
            "title": "Slug",
            "type": "string"
          },
          "parent_id": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Parent Id"
          },
          "level": {
            "title": "Level",
            "type": "integer"
          },
          "is_active": {
            "title": "Is Active",
            "type": "boolean"
          },
          "sort_order": {
            "title": "Sort Order",
            "type": "integer"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "external_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "External Code"
          },
          "hierarchy_path": {
            "title": "Hierarchy Path",
            "type": "string"
          },
          "meta_title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Meta Title"
          },
          "meta_description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Meta Description"
          },
          "meta_keywords": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Meta Keywords"
          }
        },
        "required": [
          "id",
          "name",
          "slug",
          "level",
          "is_active",
          "sort_order",
          "hierarchy_path"
        ],
        "title": "CategoryOut",
        "type": "object"
      },
      "CategoryPageOut": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/CategoryOut"
            },
            "title": "Data",
            "type": "array"
          },
          "next_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Cursor"
          },
          "has_more": {
            "title": "Has More",
            "type": "boolean"
          }
        },
        "required": [
          "data",
          "has_more"
        ],
        "title": "CategoryPageOut",
        "type": "object"
      },
      "AttributeOut": {
        "properties": {
          "id": {
            "title": "Id",
            "type": "integer"
          },
          "code": {
            "title": "Code",
            "type": "string"
          },
          "label": {
            "title": "Label",
            "type": "string"
          },
          "label_localized": {
            "additionalProperties": true,
            "title": "Label Localized",
            "type": "object"
          },
          "attribute_type": {
            "title": "Attribute Type",
            "type": "string"
          },
          "is_required": {
            "title": "Is Required",
            "type": "boolean"
          },
          "is_unique": {
            "title": "Is Unique",
            "type": "boolean"
          },
          "is_filterable": {
            "title": "Is Filterable",
            "type": "boolean"
          },
          "is_searchable": {
            "title": "Is Searchable",
            "type": "boolean"
          },
          "is_visible": {
            "title": "Is Visible",
            "type": "boolean"
          },
          "group": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GroupRefOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "options": {
            "description": "Predefined options for select/multiselect attributes.",
            "title": "Options"
          }
        },
        "required": [
          "id",
          "code",
          "label",
          "label_localized",
          "attribute_type",
          "is_required",
          "is_unique",
          "is_filterable",
          "is_searchable",
          "is_visible"
        ],
        "title": "AttributeOut",
        "type": "object"
      },
      "AttributePageOut": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/AttributeOut"
            },
            "title": "Data",
            "type": "array"
          },
          "next_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Cursor"
          },
          "has_more": {
            "title": "Has More",
            "type": "boolean"
          }
        },
        "required": [
          "data",
          "has_more"
        ],
        "title": "AttributePageOut",
        "type": "object"
      },
      "GroupRefOut": {
        "properties": {
          "id": {
            "title": "Id",
            "type": "integer"
          },
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "title": "GroupRefOut",
        "type": "object"
      }
    },
    "securitySchemes": {
      "ProjectApiKeyAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "Project API key (wpk_...)",
        "description": "Send a project API key as `Authorization: Bearer wpk_...`. Create keys under Settings > API Access in the WISEPIM app (project owners and admins). A key is bound to one project and to the scopes chosen when it was created; scopes cannot be widened afterwards. Scopes: `project:read` - Read the project's name, languages, industry and limits.; `products:read` - List and read products, including attribute values and category ids.; `products:write` - Create and update products: names, descriptions, identifiers, prices, SEO fields, categories and attribute values.; `categories:read` - List and read the project's category tree.; `attributes:read` - List and read the project's attribute definitions.",
        "x-scopes": {
          "project:read": "Read the project's name, languages, industry and limits.",
          "products:read": "List and read products, including attribute values and category ids.",
          "products:write": "Create and update products: names, descriptions, identifiers, prices, SEO fields, categories and attribute values.",
          "categories:read": "List and read the project's category tree.",
          "attributes:read": "List and read the project's attribute definitions."
        }
      }
    }
  },
  "servers": [
    {
      "url": "https://wisepim.com",
      "description": "Production. Every path below already starts with /api/public/v1."
    }
  ],
  "externalDocs": {
    "description": "WISEPIM API reference and guides",
    "url": "https://docs.wisepim.com/en/api-reference/introduction"
  },
  "security": [
    {
      "ProjectApiKeyAuth": []
    }
  ],
  "tags": [
    {
      "name": "Key and project",
      "description": "Check which key you are calling with and read the project it is bound to."
    },
    {
      "name": "Products",
      "description": "Read, create and update products. Reads need products:read, writes need products:write."
    },
    {
      "name": "Categories",
      "description": "Read the project's categories as a flat list with parent ids. Needs categories:read."
    },
    {
      "name": "Attributes",
      "description": "Read the project's attribute definitions. Needs attributes:read."
    }
  ]
}
