Brick Work

API reference

The REST API at /api/v2. Download the OpenAPI contract. Authentication and examples.

GET /wishlists

get wishlists

Request and responses
operationId: get_wishlists
x-mcp-tool: get_wishlists
summary: get wishlists
description: The wishlists in their order (`sort`, name); `archived=true` includes
  the archived ones.
tags:
- Wishlist
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- name: archived
  in: query
  schema:
    type: boolean
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfWishlist'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_wishlists
x-piece: M.11b

POST /wishlists

Create a wishlist

Request and responses
operationId: post_wishlists
x-mcp-tool: create_wishlist
summary: Create a wishlist
tags:
- Wishlist
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKeyRequired'
responses:
  '201':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenWishlist'
  default:
    $ref: '#/components/responses/Problem'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/WishlistCreate'
x-v1: post_wishlists
x-piece: M.11c

PATCH /wishlists/{id}

Rename a wishlist or change its settings

Request and responses
operationId: patch_wishlists_by_id
x-mcp-tool: edit_wishlist
summary: Rename a wishlist or change its settings
tags:
- Wishlist
security:
- bearerAuth:
  - write
parameters:
- name: id
  in: path
  required: true
  schema:
    type: string
- $ref: '#/components/parameters/IdempotencyKeyRequired'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenWishlist'
  default:
    $ref: '#/components/responses/Problem'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/WishlistPatch'
x-v1: patch_wishlists_id
x-piece: M.11c

DELETE /wishlists/{id}

Archive a wishlist

Request and responses
operationId: delete_wishlists_by_id
x-mcp-tool: archive_wishlist
summary: Archive a wishlist
tags:
- Wishlist
security:
- bearerAuth:
  - write
parameters:
- name: id
  in: path
  required: true
  schema:
    type: string
- $ref: '#/components/parameters/IdempotencyKeyRequired'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenWishlist'
  default:
    $ref: '#/components/responses/Problem'
x-v1: delete_wishlists_id
x-piece: M.11c

POST /wishlists/{id}/restore

Restore an archived wishlist

Request and responses
operationId: post_wishlists_by_id_restore
x-mcp-tool: restore_wishlist
summary: Restore an archived wishlist
tags:
- Wishlist
security:
- bearerAuth:
  - write
parameters:
- name: id
  in: path
  required: true
  schema:
    type: string
- $ref: '#/components/parameters/IdempotencyKeyRequired'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenWishlist'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_wishlists_id_restore
x-piece: M.11c

POST /wishlists/{id}/transfer

Move or copy wishes into this wishlist

Request and responses
operationId: post_wishlists_by_id_transfer
x-mcp-tool: transfer_wishes
summary: Move or copy wishes into this wishlist
tags:
- Wishlist
security:
- bearerAuth:
  - write
parameters:
- name: id
  in: path
  required: true
  schema:
    type: string
- $ref: '#/components/parameters/IdempotencyKeyRequired'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenReceipt'
  default:
    $ref: '#/components/responses/Problem'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/WishlistTransfer'
x-v1: post_wishlists_id_transfer
x-piece: M.11c

GET /wishlists/{id}/export.xml

Export wishlist as BrickLink wanted list XML

Request and responses
operationId: get_wishlists_by_id_export_xml
x-mcp-tool: export_wishlist_xml
summary: Export wishlist as BrickLink wanted list XML
tags:
- Wishlist
security:
- bearerAuth:
  - read
parameters:
- name: id
  in: path
  required: true
  schema:
    type: string
- name: kind
  in: query
  schema:
    type: string
    enum:
    - sets
    - parts
    default: parts
- name: summary
  in: query
  schema:
    type: boolean
  description: Return content and download summary as JSON. id=all exports every active
    list.
responses:
  '200':
    description: OK
    content:
      application/xml:
        schema:
          type: string
      application/json:
        schema:
          type: object
  default:
    $ref: '#/components/responses/Problem'
x-v1: export_wishlist_xml
x-piece: M.11b

GET /wishlists/{id}/export.csv

Export wishlist as Rebrickable CSV

Request and responses
operationId: get_wishlists_by_id_export_csv
x-mcp-tool: export_wishlist_csv
summary: Export wishlist as Rebrickable CSV
tags:
- Wishlist
security:
- bearerAuth:
  - read
parameters:
- name: id
  in: path
  required: true
  schema:
    type: string
- name: kind
  in: query
  schema:
    type: string
    enum:
    - sets
    - parts
    default: parts
- name: summary
  in: query
  schema:
    type: boolean
  description: Return content and download summary as JSON. id=all exports every active
    list.
responses:
  '200':
    description: OK
    content:
      text/csv:
        schema:
          type: string
      application/json:
        schema:
          type: object
  default:
    $ref: '#/components/responses/Problem'
x-v1: export_wishlist_csv
x-piece: M.11b

GET /health

Liveness, schema and API version. No token.

Request and responses
operationId: get_health
summary: Liveness, schema and API version. No token.
tags:
- Meta
security: []
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneHealth'
  '503':
    $ref: '#/components/responses/Problem'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_health
x-piece: M.11a

GET /version

Build, API and schema versions, enabled features.

Request and responses
operationId: get_version
summary: Build, API and schema versions, enabled features.
tags:
- Meta
security:
- bearerAuth:
  - read
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneVersion'
  '401':
    $ref: '#/components/responses/Unauthorized'
  '503':
    $ref: '#/components/responses/Problem'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_version
x-piece: M.11a

GET /openapi.yaml

This contract as OpenAPI 3.1 YAML. No token.

Request and responses
operationId: get_openapi_yaml
summary: This contract as OpenAPI 3.1 YAML. No token.
tags:
- Meta
security: []
responses:
  '200':
    description: File.
    content:
      application/yaml:
        schema:
          type: string
          format: binary
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_openapi_yaml
x-piece: M.11a

GET /me

The calling token: name, scopes, expiry.

Request and responses
operationId: get_me
summary: 'The calling token: name, scopes, expiry.'
tags:
- Meta
security:
- bearerAuth:
  - read
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneMe'
  '401':
    $ref: '#/components/responses/Unauthorized'
  '503':
    $ref: '#/components/responses/Problem'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_me
x-piece: M.11a

GET /catalogue/items

Search the local BrickLink catalogue file by type and text.

Request and responses
operationId: get_catalogue_items
x-mcp-tool: search_catalogue
summary: Search the local BrickLink catalogue file by type and text.
tags:
- Catalogue
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_item_kind'
- $ref: '#/components/parameters/Q_q'
- $ref: '#/components/parameters/Q_sort'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfCatalogueItem'
  '424':
    $ref: '#/components/responses/DependencyFailed'
  '429':
    $ref: '#/components/responses/BudgetExhausted'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_catalogue_items
x-piece: M.11b

GET /catalogue/items/{id}

One catalogue entry.

Request and responses
operationId: get_catalogue_items_by_id
summary: One catalogue entry.
tags:
- Catalogue
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_item_id'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneCatalogueItem'
  '404':
    $ref: '#/components/responses/NotFound'
  '424':
    $ref: '#/components/responses/DependencyFailed'
  '429':
    $ref: '#/components/responses/BudgetExhausted'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_catalogue_items_by_type_by_no
x-piece: M.11b

GET /catalogue/status

Catalogue file state (loaded, item counts, imported_at).

Request and responses
operationId: get_catalogue_status
summary: Catalogue file state (loaded, item counts, imported_at).
tags:
- Catalogue
security:
- bearerAuth:
  - read
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneCatalogueStatus'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_catalogue_status
x-piece: M.11b

GET /colors

All colours.

Request and responses
operationId: get_colors
summary: All colours.
tags:
- Catalogue
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_q'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfColor'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_colors
x-piece: M.11b

GET /colors/{color_id}

One colour.

Request and responses
operationId: get_colors_by_color_id
summary: One colour.
tags:
- Catalogue
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_color_id_int'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneColor'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_colors_by_color_id
x-piece: M.11b

GET /items

Items known to the store, with text search over name, number and properties.

Request and responses
operationId: get_items
summary: Items known to the store, with text search over name, number and properties.
tags:
- Items
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_item_kind'
- $ref: '#/components/parameters/Q_q'
- $ref: '#/components/parameters/Q_theme'
- $ref: '#/components/parameters/Q_category'
- $ref: '#/components/parameters/Q_year'
- $ref: '#/components/parameters/Q_owned'
- $ref: '#/components/parameters/Q_sort'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfItem'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_items
x-piece: M.11b

GET /items/{id}

The item: its Brick Work id, kind, name, the BrickLink numbers it is known by and its Rebrickable key (design 7). A merged id answers 307 to the survivor.

Request and responses
operationId: get_items_by_id
x-mcp-tool: get_item
summary: 'The item: its Brick Work id, kind, name, the BrickLink numbers it is known
  by and its Rebrickable key (design 7). A merged id answers 307 to the survivor.'
tags:
- Items
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_item_id'
responses:
  '200':
    description: The item.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneItem'
  '307':
    $ref: '#/components/responses/Moved'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_items_by_type_by_no
x-piece: M.11a

GET /items/{id}/inventory

Parts and figures the item is made of (inventory lines).

Request and responses
operationId: get_items_by_id_inventory
summary: Parts and figures the item is made of (inventory lines).
tags:
- Items
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_item_id'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfInventoryLine'
  '307':
    $ref: '#/components/responses/Moved'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_items_by_type_by_no_inventory
x-piece: M.11b

GET /items/{id}/used-in

Owned copies that contain this part or figure.

Request and responses
operationId: get_items_by_id_used_in
summary: Owned copies that contain this part or figure.
tags:
- Items
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_item_id'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfUsedIn'
  '307':
    $ref: '#/components/responses/Moved'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_items_by_type_by_no_used_in
x-piece: M.11b

GET /items/{id}/colors

Colours this part is known in.

Request and responses
operationId: get_items_by_id_colors
summary: Colours this part is known in.
tags:
- Items
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_item_id'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfColor'
  '307':
    $ref: '#/components/responses/Moved'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_items_by_type_by_no_colors
x-piece: M.11b

GET /items/{id}/images

Local pictures of the item.

Request and responses
operationId: get_items_by_id_images
summary: Local pictures of the item.
tags:
- Items
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_item_id'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfImage'
  '307':
    $ref: '#/components/responses/Moved'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_items_by_type_by_no_images
x-piece: M.11b

POST /items/{id}/import

Create the item identity and queue the six import steps.

Request and responses
operationId: post_items_by_id_import
x-mcp-tool: import_item
summary: Create the item identity and queue the six import steps.
tags:
- Items
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_item_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/ImportRequest'
responses:
  '202':
    description: Accepted. The job runs in the background; poll GET /jobs/{id}.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenJob'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '424':
    $ref: '#/components/responses/DependencyFailed'
  '429':
    $ref: '#/components/responses/BudgetExhausted'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_items_by_type_by_no_import
x-piece: M.11d

GET /images/{id}/content

Image bytes from the local picture store.

Request and responses
operationId: get_images_by_id_content
summary: Image bytes from the local picture store.
tags:
- Images
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_image_id'
responses:
  '200':
    description: File.
    content:
      image/*:
        schema:
          type: string
          format: binary
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_images_by_id_content
x-piece: M.11b

GET /copies

Owned set copies.

Request and responses
operationId: get_copies
x-mcp-tool: list_copies
summary: Owned set copies.
tags:
- Copies
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_number'
- $ref: '#/components/parameters/Q_provider'
- $ref: '#/components/parameters/Q_condition'
- $ref: '#/components/parameters/Q_status'
- $ref: '#/components/parameters/Q_storage'
- $ref: '#/components/parameters/Q_place'
- $ref: '#/components/parameters/Q_flag'
- $ref: '#/components/parameters/Q_lot'
- $ref: '#/components/parameters/Q_problem'
- $ref: '#/components/parameters/Q_duplicates'
- $ref: '#/components/parameters/Q_theme'
- $ref: '#/components/parameters/Q_year'
- $ref: '#/components/parameters/Q_q'
- $ref: '#/components/parameters/Q_sort'
- $ref: '#/components/parameters/Q_archived'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfCopy'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_copies
x-piece: M.11b

POST /copies

Add owned copies of a set (quantity N makes N copies) and queue its import.

Request and responses
operationId: post_copies
x-mcp-tool: add_copies
summary: Add owned copies of a set (quantity N makes N copies) and queue its import.
tags:
- Copies
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/CopyCreate'
responses:
  '200':
    description: Skipped. The client asked for decision=skip and the item is already
      owned or wished; nothing was written, event_id is null.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenSkipped'
  '201':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCreated'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_copies
x-piece: M.11c

GET /copies/{id}

One copy.

Request and responses
operationId: get_copies_by_id
x-mcp-tool: get_copy
summary: One copy.
tags:
- Copies
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneCopy'
    headers:
      ETag:
        schema:
          type: string
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_copies_by_id
x-piece: M.11b

PATCH /copies/{id}

Edit condition, completeness, storage, purchase and estimate fields, note.

Request and responses
operationId: patch_copies_by_id
x-mcp-tool: update_copy
summary: Edit condition, completeness, storage, purchase and estimate fields, note.
tags:
- Copies
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
- $ref: '#/components/parameters/IfMatch'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/CopyPatch'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCopy'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '412':
    $ref: '#/components/responses/PreconditionFailed'
  default:
    $ref: '#/components/responses/Problem'
x-v1: patch_copies_by_id
x-piece: M.11c

DELETE /copies/{id}

Archive the copy (the UI calls this deleting a set).

Request and responses
operationId: delete_copies_by_id
x-mcp-tool: archive_copy
summary: Archive the copy (the UI calls this deleting a set).
tags:
- Copies
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
- $ref: '#/components/parameters/IfMatch'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCopy'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '412':
    $ref: '#/components/responses/PreconditionFailed'
  default:
    $ref: '#/components/responses/Problem'
x-v1: delete_copies_by_id
x-piece: M.11c

POST /copies/{id}/restore

Clear the archive mark.

Request and responses
operationId: post_copies_by_id_restore
summary: Clear the archive mark.
tags:
- Copies
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCopy'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_copies_by_id_restore
x-piece: M.11c

PUT /copies/{id}/flags

Replace the copy flags.

Request and responses
operationId: put_copies_by_id_flags
summary: Replace the copy flags.
tags:
- Copies
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/FlagSet'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCopy'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: put_copies_by_id_flags
x-piece: M.11c

PUT /copies/{id}/pin

Pin or unpin a copy.

Request and responses
operationId: put_copies_by_id_pin
summary: Pin or unpin a copy.
tags:
- Copies
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/Pin'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCopy'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: put_copies_by_id_pin
x-piece: M.11c

GET /copies/{id}/completeness

Stored and derived completeness, checked flag, missing and damaged counts.

Request and responses
operationId: get_copies_by_id_completeness
x-mcp-tool: get_copy_completeness
summary: Stored and derived completeness, checked flag, missing and damaged counts.
tags:
- Copies
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneCompleteness'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_copies_by_id_completeness
x-piece: M.11b

PUT /copies/{id}/checked

Set or clear the "Set is checked" flag and recompute derived completeness.

Request and responses
operationId: put_copies_by_id_checked
x-mcp-tool: set_copy_checked
summary: Set or clear the "Set is checked" flag and recompute derived completeness.
tags:
- Copies
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/Checked'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCompleteness'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: put_copies_by_id_checked
x-piece: M.11c

GET /copies/{id}/check

Part-check session state for this copy.

Request and responses
operationId: get_copies_by_id_check
summary: Part-check session state for this copy.
tags:
- Copies
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneCheckState'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_copies_by_id_check
x-piece: M.11b

POST /copies/{id}/check

Apply one part-check action (start, answer, found_one, skip, select, back, next, spares, recheck, finish, undo).

Request and responses
operationId: post_copies_by_id_check
summary: Apply one part-check action (start, answer, found_one, skip, select, back,
  next, spares, recheck, finish, undo).
tags:
- Copies
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/CheckAction'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCheckState'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_copies_by_id_check
x-piece: M.11c

GET /copies/{id}/gaps

Missing, damaged and absent items of the copy.

Request and responses
operationId: get_copies_by_id_gaps
summary: Missing, damaged and absent items of the copy.
tags:
- Copies
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfGap'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_copies_by_id_gaps
x-piece: M.11b

GET /copies/{id}/matches

Loose stock that would fill the copy gaps.

Request and responses
operationId: get_copies_by_id_matches
summary: Loose stock that would fill the copy gaps.
tags:
- Copies
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfMatch'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_copies_by_id_matches
x-piece: M.11b

POST /copies/{id}/take

Take N of one missing part (with its colour) or whole minifigure from loose stock into the copy; one Undo reverses every move.

Request and responses
operationId: post_copies_by_id_take
x-mcp-tool: take_for_gap
summary: Take N of one missing part (with its colour) or whole minifigure from loose
  stock into the copy; one Undo reverses every move.
tags:
- Copies
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/Take'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenReceipt'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_copies_by_id_take
x-piece: M.11c

GET /copies/{id}/parts

Part lines of the copy (required, spare, figure components).

Request and responses
operationId: get_copies_by_id_parts
x-mcp-tool: list_copy_parts
summary: Part lines of the copy (required, spare, figure components).
tags:
- Copy parts
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_spare'
- $ref: '#/components/parameters/Q_parent'
- $ref: '#/components/parameters/Q_problem'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfCopyPart'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_copies_by_id_parts
x-piece: M.11b

PATCH /copies/{id}/parts/{part_id}

Set missing, damaged, checked for one line (mark missing or found).

Request and responses
operationId: patch_copies_by_id_parts_by_part_id
x-mcp-tool: set_part_missing
summary: Set missing, damaged, checked for one line (mark missing or found).
tags:
- Copy parts
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/Path_part_id_int'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/CopyPartPatch'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCopyPart'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: patch_copies_by_id_parts_by_part_id
x-piece: M.11c

POST /copies/{id}/parts/bulk

Apply missing counts to many lines by item and colour (mode set or add, optional dry run).

Request and responses
operationId: post_copies_by_id_parts_bulk
summary: Apply missing counts to many lines by item and colour (mode set or add, optional
  dry run).
tags:
- Copy parts
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/CopyPartBulk'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenBulkResult'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_copies_by_id_parts_bulk
x-piece: M.11c

GET /copies/{id}/figures

Whole figures of the copy.

Request and responses
operationId: get_copies_by_id_figures
x-mcp-tool: list_copy_figures
summary: Whole figures of the copy.
tags:
- Copy parts
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfCopyFigure'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_copies_by_id_figures
x-piece: M.11b

PATCH /copies/{id}/figures/{item_id}

Set the missing count of one whole figure.

Request and responses
operationId: patch_copies_by_id_figures_by_item_id
x-mcp-tool: set_figure_missing
summary: Set the missing count of one whole figure.
tags:
- Copy parts
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/Path_figure_item_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/CopyFigurePatch'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCopyFigure'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: patch_copies_by_id_figures_by_type_by_no
x-piece: M.11c

GET /stock

Loose stock lines (parts, minifigures, booklets, anything).

Request and responses
operationId: get_stock
x-mcp-tool: list_stock
summary: Loose stock lines (parts, minifigures, booklets, anything).
tags:
- Loose stock
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_item_kind'
- $ref: '#/components/parameters/Q_number'
- $ref: '#/components/parameters/Q_provider'
- $ref: '#/components/parameters/Q_color'
- $ref: '#/components/parameters/Q_condition'
- $ref: '#/components/parameters/Q_storage'
- $ref: '#/components/parameters/Q_lot'
- $ref: '#/components/parameters/Q_place'
- $ref: '#/components/parameters/Q_flag'
- $ref: '#/components/parameters/Q_problem'
- $ref: '#/components/parameters/Q_theme'
- $ref: '#/components/parameters/Q_year'
- $ref: '#/components/parameters/Q_q'
- $ref: '#/components/parameters/Q_sort'
- $ref: '#/components/parameters/Q_archived'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfStock'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_stock
x-piece: M.11b

POST /stock

Add loose stock; identical lines merge.

Request and responses
operationId: post_stock
x-mcp-tool: add_stock
summary: Add loose stock; identical lines merge.
tags:
- Loose stock
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/StockCreate'
responses:
  '201':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCreated'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_stock
x-piece: M.11c

GET /stock/{id}

One stock line.

Request and responses
operationId: get_stock_by_id
summary: One stock line.
tags:
- Loose stock
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneStock'
    headers:
      ETag:
        schema:
          type: string
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_stock_by_id
x-piece: M.11b

PATCH /stock/{id}

Edit a stock line (may merge into an existing line; response lists merged ids).

Request and responses
operationId: patch_stock_by_id
x-mcp-tool: update_stock
summary: Edit a stock line (may merge into an existing line; response lists merged
  ids).
tags:
- Loose stock
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
- $ref: '#/components/parameters/IfMatch'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/StockPatch'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenStock'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '412':
    $ref: '#/components/responses/PreconditionFailed'
  default:
    $ref: '#/components/responses/Problem'
x-v1: patch_stock_by_id
x-piece: M.11c

DELETE /stock/{id}

Archive the line.

Request and responses
operationId: delete_stock_by_id
summary: Archive the line.
tags:
- Loose stock
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
- $ref: '#/components/parameters/IfMatch'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenStock'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '412':
    $ref: '#/components/responses/PreconditionFailed'
  default:
    $ref: '#/components/responses/Problem'
x-v1: delete_stock_by_id
x-piece: M.11c

POST /stock/{id}/restore

Clear the archive mark.

Request and responses
operationId: post_stock_by_id_restore
summary: Clear the archive mark.
tags:
- Loose stock
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenStock'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_stock_by_id_restore
x-piece: M.11c

PUT /stock/{id}/flags

Replace the line flags.

Request and responses
operationId: put_stock_by_id_flags
summary: Replace the line flags.
tags:
- Loose stock
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/FlagSet'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenStock'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: put_stock_by_id_flags
x-piece: M.11c

GET /stock/{id}/parts

Parts of a loose minifigure.

Request and responses
operationId: get_stock_by_id_parts
summary: Parts of a loose minifigure.
tags:
- Loose stock
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfLooseFigurePart'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_stock_by_id_parts
x-piece: M.11b

PATCH /stock/{id}/parts

Set missing and damaged on parts of a loose minifigure.

Request and responses
operationId: patch_stock_by_id_parts
summary: Set missing and damaged on parts of a loose minifigure.
tags:
- Loose stock
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/LooseFigurePartPatch'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenLooseFigureParts'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: patch_stock_by_id_parts
x-piece: M.11c

POST /stock/{id}/give

Give N from this line to a copy gap or a loose-figure part gap.

Request and responses
operationId: post_stock_by_id_give
x-mcp-tool: give_from_stock
summary: Give N from this line to a copy gap or a loose-figure part gap.
tags:
- Loose stock
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/Give'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenReceipt'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_stock_by_id_give
x-piece: M.11c

POST /stock/booklets

Add loose booklets from lines "set number, quantity".

Request and responses
operationId: post_stock_booklets
summary: Add loose booklets from lines "set number, quantity".
tags:
- Loose stock
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/Booklets'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenReceipt'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_stock_booklets
x-piece: M.11c

POST /found

Record found parts into copies, a loose line, or a list.

Request and responses
operationId: post_found
summary: Record found parts into copies, a loose line, or a list.
tags:
- Loose stock
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/Found'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenReceipt'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_found
x-piece: M.11c

GET /minifigures

Figures by identity: owned in sets, loose, missing.

Request and responses
operationId: get_minifigures
x-mcp-tool: list_minifigures
summary: 'Figures by identity: owned in sets, loose, missing.'
tags:
- Minifigures
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_color'
- $ref: '#/components/parameters/Q_provider'
- $ref: '#/components/parameters/Q_problem'
- $ref: '#/components/parameters/Q_theme'
- $ref: '#/components/parameters/Q_year'
- $ref: '#/components/parameters/Q_q'
- $ref: '#/components/parameters/Q_sort'
- $ref: '#/components/parameters/Q_inventory'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfMinifigureRow'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_minifigures
x-piece: M.11b

GET /minifigures/{id}

One figure: sets, loose lines, missing, matches, prices.

Request and responses
operationId: get_minifigures_by_id
summary: 'One figure: sets, loose lines, missing, matches, prices.'
description: The item detail of a minifigure by its Brick Work id (`used_in` the sets,
  `stock` the loose lines, `gaps` and `matches`). A merged id is `307` to the survivor's
  `/minifigures/{id}`; an item that is not a figure is `404`.
tags:
- Minifigures
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_item_id'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneItemDetail'
  '307':
    $ref: '#/components/responses/Moved'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_minifigures_by_no
x-piece: M.11b

GET /gaps

Missing items over all copies and loose figures.

Request and responses
operationId: get_gaps
x-mcp-tool: list_gaps
summary: Missing items over all copies and loose figures.
tags:
- Matching
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_item_kind'
- $ref: '#/components/parameters/Q_number'
- $ref: '#/components/parameters/Q_provider'
- $ref: '#/components/parameters/Q_color'
- $ref: '#/components/parameters/Q_copy_id'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfGap'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_gaps
x-piece: M.11b

GET /matches

Suggestions: loose stock that fills a gap.

Request and responses
operationId: get_matches
x-mcp-tool: list_matches
summary: 'Suggestions: loose stock that fills a gap.'
tags:
- Matching
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_item_kind'
- $ref: '#/components/parameters/Q_number'
- $ref: '#/components/parameters/Q_provider'
- $ref: '#/components/parameters/Q_color'
- $ref: '#/components/parameters/Q_copy_id'
- $ref: '#/components/parameters/Q_completes'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfMatch'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_matches
x-piece: M.11b

GET /instruction-files

Booklet files and booklet identities with coverage.

Request and responses
operationId: get_instruction_files
x-mcp-tool: list_instruction_files
summary: Booklet files and booklet identities with coverage.
tags:
- Instructions
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_item_kind'
- $ref: '#/components/parameters/Q_number'
- $ref: '#/components/parameters/Q_provider'
- $ref: '#/components/parameters/Q_has_file'
- $ref: '#/components/parameters/Q_archived'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfInstructionFile'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_instruction_files
x-piece: M.11b

POST /instruction-files

Attach a PDF (multipart, up to 20 MB) to an item.

Request and responses
operationId: post_instruction_files
summary: Attach a PDF (multipart, up to 20 MB) to an item.
tags:
- Instructions
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    multipart/form-data:
      schema:
        $ref: '#/components/schemas/InstructionUpload'
responses:
  '201':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenInstructionFile'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_instruction_files
x-piece: M.11c

GET /instruction-files/{id}

One file record.

Request and responses
operationId: get_instruction_files_by_id
summary: One file record.
tags:
- Instructions
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id_int'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneInstructionFile'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_instruction_files_by_id
x-piece: M.11b

PATCH /instruction-files/{id}

Rename the label.

Request and responses
operationId: patch_instruction_files_by_id
summary: Rename the label.
tags:
- Instructions
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id_int'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/InstructionPatch'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenInstructionFile'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: patch_instruction_files_by_id
x-piece: M.11c

DELETE /instruction-files/{id}

Archive a PDF association.

Request and responses
operationId: delete_instruction_files_by_id
summary: Archive a PDF association.
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id_int'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Archived.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenDeleted'
  default:
    $ref: '#/components/responses/Problem'
x-v1: delete_instruction_files_by_id
x-piece: M.11c

GET /instruction-files/{id}/content

Download the PDF.

Request and responses
operationId: get_instruction_files_by_id_content
summary: Download the PDF.
tags:
- Instructions
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id_int'
responses:
  '200':
    description: File.
    content:
      application/pdf:
        schema:
          type: string
          format: binary
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_instruction_files_by_id_content
x-piece: M.11b

GET /prices

Current price per item, colour, condition and guide.

Request and responses
operationId: get_prices
summary: Current price per item, colour, condition and guide.
tags:
- Prices
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_item_kind'
- $ref: '#/components/parameters/Q_number'
- $ref: '#/components/parameters/Q_provider'
- $ref: '#/components/parameters/Q_color'
- $ref: '#/components/parameters/Q_condition'
- $ref: '#/components/parameters/Q_guide'
- $ref: '#/components/parameters/Q_source'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfPriceCurrent'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_prices
x-piece: M.11b

GET /items/{id}/prices

Current prices and recorded observations of one item.

Request and responses
operationId: get_items_by_id_prices
x-mcp-tool: get_prices
summary: Current prices and recorded observations of one item.
tags:
- Prices
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_item_id'
- $ref: '#/components/parameters/Q_color'
- $ref: '#/components/parameters/Q_provider'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneItemPrices'
  '307':
    $ref: '#/components/responses/Moved'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_items_by_type_by_no_prices
x-piece: M.11b

POST /items/{id}/prices

Record one manual or valuation observation; Undo sets error=undone and recomputes price_current.

Request and responses
operationId: post_items_by_id_prices
x-mcp-tool: record_price
summary: Record one manual or valuation observation; Undo sets error=undone and recomputes
  price_current.
tags:
- Prices
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_item_id'
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/PriceCreate'
responses:
  '201':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenPriceObservation'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_items_by_type_by_no_prices
x-piece: M.11c

GET /items/{id}/prices/history

Observation history of one item.

Request and responses
operationId: get_items_by_id_prices_history
summary: Observation history of one item.
tags:
- Prices
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_item_id'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_color'
- $ref: '#/components/parameters/Q_provider'
- $ref: '#/components/parameters/Q_condition'
- $ref: '#/components/parameters/DirectionNewest'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfPriceObservation'
  '307':
    $ref: '#/components/responses/Moved'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_items_by_type_by_no_prices_history
x-piece: M.11b

POST /prices/observations

Record up to 500 observations in one transaction.

Request and responses
operationId: post_prices_observations
summary: Record up to 500 observations in one transaction.
tags:
- Prices
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/PriceBatch'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenBulkResult'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_prices_observations
x-piece: M.11c

POST /items/{id}/prices/refresh

Queue a market price refresh for one item.

Request and responses
operationId: post_items_by_id_prices_refresh
x-mcp-tool: refresh_price
summary: Queue a market price refresh for one item.
tags:
- Prices
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_item_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/RefreshRequest'
responses:
  '202':
    description: Accepted. The job runs in the background; poll GET /jobs/{id}.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenJob'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '424':
    $ref: '#/components/responses/DependencyFailed'
  '429':
    $ref: '#/components/responses/BudgetExhausted'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_items_by_type_by_no_prices_refresh
x-piece: M.11d

GET /prices/stale

Items whose price is older than the freshness rule.

Request and responses
operationId: get_prices_stale
x-mcp-tool: list_stale_prices
summary: Items whose price is older than the freshness rule.
tags:
- Prices
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfStaleItem'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_prices_stale
x-piece: M.11b

POST /prices/refresh

Queue refresh jobs for every stale item.

Request and responses
operationId: post_prices_refresh
summary: Queue refresh jobs for every stale item.
tags:
- Prices
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenJobList'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '424':
    $ref: '#/components/responses/DependencyFailed'
  '429':
    $ref: '#/components/responses/BudgetExhausted'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_prices_refresh
x-piece: M.11d

GET /wishes

Wishlist rows; under_max filters to rows priced under the wish maximum.

Request and responses
operationId: get_wishes
x-mcp-tool: list_wishes
summary: Wishlist rows; under_max filters to rows priced under the wish maximum.
tags:
- Wishlist
security:
- bearerAuth:
  - read
parameters:
- name: list
  in: query
  schema:
    type: string
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_item_kind'
- $ref: '#/components/parameters/Q_number'
- $ref: '#/components/parameters/Q_provider'
- $ref: '#/components/parameters/Q_color'
- $ref: '#/components/parameters/Q_condition'
- $ref: '#/components/parameters/Q_flag'
- $ref: '#/components/parameters/Q_under_max'
- $ref: '#/components/parameters/Q_q'
- $ref: '#/components/parameters/Q_sort'
- $ref: '#/components/parameters/Q_archived'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfWish'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_wishes
x-piece: M.11b

POST /wishes

Add a wish (same colour and item adds to the live row on decision=another).

Request and responses
operationId: post_wishes
x-mcp-tool: add_wish
summary: Add a wish (same colour and item adds to the live row on decision=another).
tags:
- Wishlist
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/WishCreate'
responses:
  '200':
    description: Skipped. The client asked for decision=skip and the item is already
      owned or wished; nothing was written, event_id is null.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenSkipped'
  '201':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCreated'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_wishes
x-piece: M.11c

GET /wishes/{id}

One wish.

Request and responses
operationId: get_wishes_by_id
summary: One wish.
tags:
- Wishlist
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_wish_id'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneWish'
    headers:
      ETag:
        schema:
          type: string
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_wishes_by_id
x-piece: M.11b

PATCH /wishes/{id}

Edit quantity, colour, condition, max price, max price with box and their currencies, note.

Request and responses
operationId: patch_wishes_by_id
x-mcp-tool: update_wish
summary: Edit quantity, colour, condition, max price, max price with box and their
  currencies, note.
tags:
- Wishlist
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_wish_id'
- $ref: '#/components/parameters/IdempotencyKey'
- $ref: '#/components/parameters/IfMatch'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/WishPatch'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenWish'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '412':
    $ref: '#/components/responses/PreconditionFailed'
  default:
    $ref: '#/components/responses/Problem'
x-v1: patch_wishes_by_id
x-piece: M.11c

DELETE /wishes/{id}

Archive the wish.

Request and responses
operationId: delete_wishes_by_id
x-mcp-tool: archive_wish
summary: Archive the wish.
tags:
- Wishlist
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_wish_id'
- $ref: '#/components/parameters/IdempotencyKey'
- $ref: '#/components/parameters/IfMatch'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenWish'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '412':
    $ref: '#/components/responses/PreconditionFailed'
  default:
    $ref: '#/components/responses/Problem'
x-v1: delete_wishes_by_id
x-piece: M.11c

POST /wishes/{id}/restore

Restore an archived wish.

Request and responses
operationId: post_wishes_by_id_restore
summary: Restore an archived wish.
tags:
- Wishlist
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_wish_id'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenWish'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_wishes_by_id_restore
x-piece: M.11c

PUT /wishes/{id}/flags

Replace the wish flags.

Request and responses
operationId: put_wishes_by_id_flags
summary: Replace the wish flags.
tags:
- Wishlist
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_wish_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/FlagSet'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenWish'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: put_wishes_by_id_flags
x-piece: M.11c

POST /wishes/{id}/to-owned

Turn a wish into owned copies and archive the wish, one transaction.

Request and responses
operationId: post_wishes_by_id_to_owned
x-mcp-tool: wish_to_owned
summary: Turn a wish into owned copies and archive the wish, one transaction.
tags:
- Wishlist
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_wish_id'
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/WishToOwned'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCreated'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_wishes_by_id_to_owned
x-piece: M.11c

GET /storages

Active storages with counts, plus the virtual "Not stored".

Request and responses
operationId: get_storages
x-mcp-tool: list_storages
summary: Active storages with counts, plus the virtual "Not stored".
tags:
- Storages
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfStorage'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_storages
x-piece: M.11b

POST /storages

Create a storage.

Request and responses
operationId: post_storages
x-mcp-tool: create_storage
summary: Create a storage.
tags:
- Storages
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/StorageInput'
responses:
  '201':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenStorage'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_storages
x-piece: M.11c

GET /storages/{id}

Storage with its contents.

Request and responses
operationId: get_storages_by_id
summary: Storage with its contents.
tags:
- Storages
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneStorageDetail'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_storages_by_id
x-piece: M.11b

PATCH /storages/{id}

Rename.

Request and responses
operationId: patch_storages_by_id
summary: Rename.
tags:
- Storages
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/StorageInput'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenStorage'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: patch_storages_by_id
x-piece: M.11c

DELETE /storages/{id}

Archive; refuses non-empty unless move_to_unstored=true.

Request and responses
operationId: delete_storages_by_id
summary: Archive; refuses non-empty unless move_to_unstored=true.
tags:
- Storages
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/Q_move_to_unstored'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenStorage'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: delete_storages_by_id
x-piece: M.11c

POST /storages/{id}/contents

Move copies, stock and lots into this storage (id "unstored" for none). A lot carries its parts in the same storage.

Request and responses
operationId: post_storages_by_id_contents
x-mcp-tool: move_to_storage
summary: Move copies, stock and lots into this storage (id "unstored" for none). A
  lot carries its parts in the same storage.
tags:
- Storages
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/StorageMove'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenReceipt'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_storages_by_id_contents
x-piece: M.11c

GET /lots

Part lots.

Request and responses
operationId: get_lots
x-mcp-tool: list_lots
summary: Part lots.
tags:
- Lots
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_storage'
- $ref: '#/components/parameters/Q_archived'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfLot'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_lots
x-piece: M.11b

POST /lots

Create a lot from existing stock lines.

Request and responses
operationId: post_lots
summary: Create a lot from existing stock lines.
tags:
- Lots
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/LotCreate'
responses:
  '201':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenLot'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_lots
x-piece: M.11c

GET /lots/{id}

Lot with its stock.

Request and responses
operationId: get_lots_by_id
summary: Lot with its stock.
tags:
- Lots
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneLotDetail'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_lots_by_id
x-piece: M.11b

PATCH /lots/{id}

Edit name, note, storage, purchase fields.

Request and responses
operationId: patch_lots_by_id
summary: Edit name, note, storage, purchase fields.
tags:
- Lots
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/LotPatch'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenLot'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: patch_lots_by_id
x-piece: M.11c

DELETE /lots/{id}

Archive the lot.

Request and responses
operationId: delete_lots_by_id
summary: Archive the lot.
tags:
- Lots
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenLot'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: delete_lots_by_id
x-piece: M.11c

GET /places

Purchase locations with counts and totals per currency.

Request and responses
operationId: get_places
x-mcp-tool: list_places
summary: Purchase locations with counts and totals per currency.
tags:
- Places
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfPlace'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_places
x-piece: M.11b

POST /places

Create a purchase location.

Request and responses
operationId: post_places
summary: Create a purchase location.
tags:
- Places
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/NameInput'
responses:
  '201':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenPlace'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_places
x-piece: M.11c

PATCH /places/{id}

Rename.

Request and responses
operationId: patch_places_by_id
summary: Rename.
tags:
- Places
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/NameInput'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenPlace'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: patch_places_by_id
x-piece: M.11c

DELETE /places/{id}

Archive retaining references; Undo restores the place.

Request and responses
operationId: delete_places_by_id
summary: Archive retaining references; Undo restores the place.
tags:
- Places
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenDeleted'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: delete_places_by_id
x-piece: M.11c

GET /flags

Flags of kind owner, status and tag.

Request and responses
operationId: get_flags
x-mcp-tool: list_flags
summary: Flags of kind owner, status and tag.
tags:
- Flags
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_kind'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfFlag'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_flags
x-piece: M.11b

POST /flags

Create a flag.

Request and responses
operationId: post_flags
summary: Create a flag.
tags:
- Flags
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/FlagInput'
responses:
  '201':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenFlag'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_flags
x-piece: M.11c

PATCH /flags/{id}

Rename.

Request and responses
operationId: patch_flags_by_id
summary: Rename.
tags:
- Flags
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/NameInput'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenFlag'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: patch_flags_by_id
x-piece: M.11c

DELETE /flags/{id}

Archive retaining flag links; Undo restores the flag.

Request and responses
operationId: delete_flags_by_id
summary: Archive retaining flag links; Undo restores the flag.
tags:
- Flags
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenDeleted'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: delete_flags_by_id
x-piece: M.11c

GET /planning/ranking

Owned copies ranked by cost to complete, with the repair settings used.

Request and responses
operationId: get_planning_ranking
x-mcp-tool: get_planning_ranking
summary: Owned copies ranked by cost to complete, with the repair settings used.
tags:
- Planning
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_sort'
- $ref: '#/components/parameters/Q_q'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/RankingPage'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_planning_ranking
x-piece: M.11b

GET /planning/set-scores

The catalogue's sets ranked by how much of a pile of loose parts each explains.

Request and responses
operationId: get_planning_set_scores
x-mcp-tool: get_planning_set_scores
summary: The catalogue's sets ranked by how much of a pile of loose parts each explains.
description: 'Scores the live loose stock of one lot, one storage (and the storages
  inside it), all loose stock, or a saved selection of stock lines (`stock`, repeated)
  against the active catalogue build; give exactly one of `lot`, `storage`, `loose=true`
  or `stock`. Read-only. Each set carries the evidence (the sum, over the lines of
  the pile that the set holds, of the line''s rarity weight ln(N/df) times the covered
  share of the set''s quantity), the coverage (evidence over the set''s own total
  weight), the covered and complete lines, the distinctive lines found of the set''s
  distinctive ones, the matched lines (the heaviest `detail` of them, with the stock
  flags passed through and summed per flag), and the swaps: the same part in another
  colour or as an alternate mould, listed apart and never counted in any number. Ranked
  by evidence, then coverage, then set id. ADR 0026.'
tags:
- Planning
security:
- bearerAuth:
  - read
parameters:
- name: lot
  in: query
  description: A lot id; scores its live loose parts and figures.
  schema:
    type: string
- name: storage
  in: query
  description: A storage id; scores the live loose stock kept in it and in the storages
    inside it.
  schema:
    type: string
- name: loose
  in: query
  description: true scores all live loose parts and figures.
  schema:
    type: boolean
- name: stock
  in: query
  description: Stock line ids (live loose parts or figures), 1 to 5000 different ones.
  style: form
  explode: true
  schema:
    type: array
    items:
      type: string
    maxItems: 5000
    uniqueItems: true
- name: limit
  in: query
  schema:
    type: integer
    minimum: 1
    maximum: 100
    default: 20
- name: offset
  in: query
  schema:
    type: integer
    minimum: 0
    default: 0
- name: detail
  in: query
  description: How many matched lines each set lists (the numbers always count all
    of them).
  schema:
    type: integer
    minimum: 0
    maximum: 50
    default: 10
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/SetScorePage'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11b

GET /lots/{id}/candidate-sets

The sets a lot may have come from, ranked, with reasons and distinctive parts (Lot Detective).

Request and responses
operationId: get_lots_by_id_candidate_sets
x-mcp-tool: get_lot_candidate_sets
summary: The sets a lot may have come from, ranked, with reasons and distinctive parts
  (Lot Detective).
description: 'Scores the live loose parts and figures of the lot against the active
  catalogue build (the engine of `GET /planning/set-scores`, ADR 0026) and returns
  the candidate sets. The `score` is 0 to 100: how strongly the found parts point
  to the set, weighed by how rare each part is, relative to the best candidate (the
  first set that passes the set filters scores 100). It is NOT a probability and says
  nothing about how likely the set is to be the right one in absolute terms. Each
  set has `reasons` (for example "7 of 9 distinctive parts found", "2 printed parts
  only in this set"), the distinctive parts found and not found yet (a distinctive
  part is held by at most 25 sets; up to 20 of each, heaviest first, with their pictures)
  and the stock flags passed to the engine (a flag named Sticker as `sticker`), and
  the swaps (the lot has the part in another colour, or an alternate mould), listed
  apart and never in the score. A Sticker flag raises the sets that hold the part
  and a sticker sheet, and a confirmed sticker is strong evidence for its set (`POST
  /lots/{id}/stock/{stock_id}/sticker`). By default `ignore_common` drops the lines
  held by more than N sets before scoring (setting `candidate_sets_common_max`, default
  300). The theme filter takes a catalogue theme id or a name (its sub-themes are
  included); the part range is the catalogue''s part count of the set. Read-only;
  an unknown lot is 404.'
tags:
- Lots
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id'
- name: min_score
  in: query
  description: Only sets scoring at least this (0 to 100).
  schema:
    type: number
    minimum: 0
    maximum: 100
    default: 0
- name: theme
  in: query
  description: A catalogue theme id or name; the theme and the themes below it.
  schema:
    type: string
- name: year_from
  in: query
  description: Only sets released in this year or later.
  schema:
    type: integer
    minimum: 0
- name: year_to
  in: query
  description: Only sets released in this year or earlier.
  schema:
    type: integer
    minimum: 0
- name: parts_min
  in: query
  description: Only sets with at least this many parts (the catalogue's part count).
  schema:
    type: integer
    minimum: 0
- name: parts_max
  in: query
  description: Only sets with at most this many parts (the catalogue's part count).
  schema:
    type: integer
    minimum: 0
- name: ignore_common
  in: query
  description: Drop the parts that more than `candidate_sets_common_max` sets hold
    before scoring (default true).
  schema:
    type: boolean
    default: true
- name: limit
  in: query
  schema:
    type: integer
    minimum: 1
    maximum: 100
    default: 20
- name: offset
  in: query
  schema:
    type: integer
    minimum: 0
    default: 0
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/CandidateSetPage'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11b

GET /planning/build-scout

Build Scout (#9): the catalogue's sets ranked by how much of each the loose stock already makes.

Request and responses
operationId: get_planning_build_scout
x-mcp-tool: get_planning_build_scout
summary: 'Build Scout (#9): the catalogue''s sets ranked by how much of each the loose
  stock already makes.'
description: 'For every catalogue set that shares a part with the chosen loose stock:
  the parts available (the sum over the set''s own part lines of min(have, need);
  spares and a minifigure''s components are not part lines), the percent of the set''s
  parts that is, the missing parts and lines, the whole figures available of those
  required (a loose whole figure counts), and with `detail` the biggest missing lines,
  the missing figures, the cost to complete (missing lines priced from the current
  prices, in the one currency most are priced in, with the number of unpriced lines)
  and the swaps (another colour, an alternate mould), listed apart and never in a
  number. Ranked by percent available, then fewest missing parts, then set id. The
  stock is the live loose parts and whole figures with what can be given (damaged
  rows give nothing unless `damaged=true`) of the chosen sources: `loose=true` (the
  stock kept in no lot or storage), the `lot` and `storage` ids (a storage with the
  storages inside it), or all loose stock when none is given. Read-only. ADR 0027.'
tags:
- Planning
security:
- bearerAuth:
  - read
parameters:
- name: lot
  in: query
  description: Lot ids (repeated); the stock kept in them.
  style: form
  explode: true
  schema:
    type: array
    items:
      type: string
    maxItems: 500
    uniqueItems: true
- name: storage
  in: query
  description: Storage ids (repeated); the stock kept in them and in the storages
    inside them.
  style: form
  explode: true
  schema:
    type: array
    items:
      type: string
    maxItems: 500
    uniqueItems: true
- name: loose
  in: query
  description: true adds the stock kept in no lot or storage.
  schema:
    type: boolean
- name: damaged
  in: query
  description: true counts stock whose condition is damaged (off by default).
  schema:
    type: boolean
- name: min_percent
  in: query
  description: The least percent of a set's parts that must be available.
  schema:
    type: integer
    minimum: 0
    maximum: 100
    default: 60
- name: max_missing
  in: query
  description: The most missing parts (pieces) a set may have.
  schema:
    type: integer
    minimum: 0
- name: theme
  in: query
  description: A catalogue theme id or name (any case), with its sub-themes.
  schema:
    type: string
- name: year_from
  in: query
  schema:
    type: integer
- name: year_to
  in: query
  schema:
    type: integer
- name: size_from
  in: query
  description: The fewest parts a set has (spares left out).
  schema:
    type: integer
    minimum: 0
- name: size_to
  in: query
  schema:
    type: integer
    minimum: 0
- name: limit
  in: query
  schema:
    type: integer
    minimum: 1
    maximum: 100
    default: 20
- name: offset
  in: query
  schema:
    type: integer
    minimum: 0
    default: 0
- name: detail
  in: query
  description: How many missing lines each set lists, with its missing figures, cost
    and swaps (0 lists none of them).
  schema:
    type: integer
    minimum: 0
    maximum: 50
    default: 0
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/BuildScoutPage'
  '404':
    $ref: '#/components/responses/NotFound'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11b

GET /lots/{id}/stock/{stock_id}/stickers

The sets a sticker on a part line of a lot may belong to (sets that hold the part in its colour and a sticker sheet).

Request and responses
operationId: get_lots_by_id_stock_by_stock_id_stickers
x-mcp-tool: list_sticker_candidates
summary: The sets a sticker on a part line of a lot may belong to (sets that hold
  the part in its colour and a sticker sheet).
description: 'The catalogue does not say which part a sticker goes on, so this is
  the fallback: the live catalogue sets whose latest inventory holds the part in the
  line''s colour AND a sticker sheet (a part of the category named `Stickers`; spare
  lines are left out). A set with several sheets is one row, its sheet with the lowest
  number first; sets with a sheet picture come first, then the earlier year. `sticker`
  says whether the line holds the Sticker flag and which set was confirmed ("This
  one"). Read-only; a line that is not a live part of the lot is 404.'
tags:
- Lots
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/Path_stock_id'
- name: limit
  in: query
  schema:
    type: integer
    minimum: 1
    maximum: 100
    default: 20
- name: offset
  in: query
  schema:
    type: integer
    minimum: 0
    default: 0
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/StickerCandidatePage'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11b

POST /lots/{id}/stock/{stock_id}/sticker

Confirm the sticker of a part line: the sheet of a set from the candidates ("This one"). One undoable event; choosing what is already chosen writes nothing.

Request and responses
operationId: post_lots_by_id_stock_by_stock_id_sticker
x-mcp-tool: confirm_sticker
summary: 'Confirm the sticker of a part line: the sheet of a set from the candidates
  ("This one"). One undoable event; choosing what is already chosen writes nothing.'
description: The line must hold the Sticker flag (409 otherwise) and the pair must
  be one of the line's candidates (422 otherwise). A confirmed sticker is strong evidence
  for its set in Lot Detective and `GET /planning/set-scores`; the flag alone is a
  smaller hint. Undo takes the choice back.
tags:
- Lots
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/Path_stock_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/StickerConfirm'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenSticker'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11c

DELETE /lots/{id}/stock/{stock_id}/sticker

Not a sticker: remove the Sticker flag from a part line and stop counting a confirmed sticker. One undoable event; a line without the flag writes nothing.

Request and responses
operationId: delete_lots_by_id_stock_by_stock_id_sticker
x-mcp-tool: clear_sticker
summary: 'Not a sticker: remove the Sticker flag from a part line and stop counting
  a confirmed sticker. One undoable event; a line without the flag writes nothing.'
tags:
- Lots
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/Path_stock_id'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenSticker'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11c

GET /lots/{id}/pull-list/{set_id}

The pull list of a set for a lot (#202, Lot Detective): the set's lines with what each needs, what the lot holds and what is found so far.

Request and responses
operationId: get_lots_by_id_pull_list_by_set_id
x-mcp-tool: get_lot_pull_list
summary: 'The pull list of a set for a lot (#202, Lot Detective): the set''s lines
  with what each needs, what the lot holds and what is found so far.'
description: 'The set''s own parts (the latest Rebrickable list, sub-sets expanded,
  spares left out) and its whole minifigures, as Build Scout reads them. Per line:
  `need` (what the set has), `held` (what the lot can give: damaged rows give nothing),
  `found` (`held` plus the pieces ticked in the bulk and not filed yet, never above
  `need`) and `to_find`. `totals` count pieces over all lines: `moves` is what Make
  it a copy would move out of the lot, `missing` what it would record as missing on
  the copy and `stays` what the lot keeps. Lines come in category then number order
  (whole figures last); `show` keeps the lines still to find (`find`), the complete
  ones (`found`) or all. `refusal` says why Make it a copy would be refused (a set
  made of other sets, nothing found yet). Read-only; an unknown lot or set is 404,
  a set with no part list 422.'
tags:
- Lots
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/Path_set_item_id'
- name: show
  in: query
  description: Which lines to list; the totals always count the whole list.
  schema:
    type: string
    enum:
    - find
    - found
    - all
    default: all
- name: limit
  in: query
  schema:
    type: integer
    minimum: 1
    maximum: 500
    default: 100
- name: offset
  in: query
  schema:
    type: integer
    minimum: 0
    default: 0
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/PullListPage'
  '404':
    $ref: '#/components/responses/NotFound'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11b

POST /lots/{id}/pull-list/{set_id}/found

Save how many of one part of the pull list are found (an absolute count, idempotent; kept between visits). Not an event: nothing to undo.

Request and responses
operationId: post_lots_by_id_pull_list_by_set_id_found
summary: 'Save how many of one part of the pull list are found (an absolute count,
  idempotent; kept between visits). Not an event: nothing to undo.'
description: The count includes what the lot already holds of the line (`held`); a
  count below it only drops the pieces ticked in the bulk. Pieces ticked and not in
  the lot yet are filed in the lot, as found in the bulk, when Make it a copy runs.
  The line must be on the list (422 otherwise) and `found` is 0 to its `need`. `event_id`
  and `undo_url` are always null.
tags:
- Lots
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/Path_set_item_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/PullFound'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenPullFound'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11c

POST /lots/{id}/pull-list/{set_id}/make-copy

Make it a copy (#202): the found pieces of the pull list move out of the lot into a new copy of the set, the rest recorded as missing on it. One undoable event.

Request and responses
operationId: post_lots_by_id_pull_list_by_set_id_make_copy
x-mcp-tool: make_copy_from_lot
summary: 'Make it a copy (#202): the found pieces of the pull list move out of the
  lot into a new copy of the set, the rest recorded as missing on it. One undoable
  event.'
description: 'One transaction and one event (`copy` / `make_from_stock`). The pieces
  ticked in the bulk are filed in the lot first, then exactly the found counts move
  from the lot''s stock rows into the copy (nothing of another lot); everything the
  set has and was not found is recorded as missing on the copy, which starts used,
  incomplete and not checked. The lot keeps the leftovers and the progress of this
  (lot, set) is cleared. Undo (`POST /events/{id}/undo`) puts the stock back and archives
  the copy; the pieces ticked in the bulk stay filed in the lot. Refused with 422
  and nothing written: a set made of other sets, nothing found yet, a set with no
  part list.'
tags:
- Lots
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/Path_set_item_id'
- $ref: '#/components/parameters/IdempotencyKeyRequired'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCopyFromLot'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11c

GET /export/missing.csv

Missing parts of the chosen copies as CSV (the printable list, #43).

Request and responses
operationId: get_export_missing_csv
summary: 'Missing parts of the chosen copies as CSV (the printable list, #43).'
security:
- bearerAuth:
  - read
parameters:
- name: copy_id
  in: query
  description: Repeated copy IDs.
  style: form
  explode: true
  schema:
    type: array
    items:
      type: string
    maxItems: 2000
    uniqueItems: true
- name: ids
  in: query
  description: Comma-separated copy IDs; alternative to copy_id.
  schema:
    type: string
responses:
  '200':
    description: CSV with the columns Item type, Item number, Name, Colour, Colour
      id, Condition, Quantity.
    content:
      text/csv:
        schema:
          type: string
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_export_missing_csv
x-piece: M.11b

GET /export/picker.csv

Part Runner results for the chosen copies as CSV, in pick order (#43).

Request and responses
operationId: get_export_picker_csv
summary: Part Runner results for the chosen copies as CSV, in pick order (#43).
security:
- bearerAuth:
  - read
parameters:
- name: copy_id
  in: query
  description: Repeated copy IDs.
  style: form
  explode: true
  schema:
    type: array
    items:
      type: string
    maxItems: 2000
    uniqueItems: true
- name: rank
  in: query
  description: Pick order keys (category, colour, size, set, storage); default all.
  style: form
  explode: true
  schema:
    type: array
    items:
      type: string
responses:
  '200':
    description: CSV with the columns Rank, Item type, Item number, Name, Colour,
      Colour id, Quantity, Sets, Storage.
    content:
      text/csv:
        schema:
          type: string
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_export_picker_csv
x-piece: M.11b

GET /export/wishlist.csv

The wishlist (one list or all) as CSV (#43).

Request and responses
operationId: get_export_wishlist_csv
summary: The wishlist (one list or all) as CSV (#43).
security:
- bearerAuth:
  - read
parameters:
- name: list
  in: query
  description: A wishlist id, or all (default).
  schema:
    type: string
responses:
  '200':
    description: CSV with the columns List, Item type, Item number, Name, Colour,
      Colour id, Quantity, Condition, Max price, Currency, Note.
    content:
      text/csv:
        schema:
          type: string
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_export_wishlist_csv
x-piece: M.11b

GET /export/missing.json

Aggregated missing items for chosen copies, using the XML export rules.

Request and responses
operationId: get_export_missing_json
summary: Aggregated missing items for chosen copies, using the XML export rules.
description: One line per item, colour and condition, each with the BrickLink type,
  number and colour number the XML names it by. A line with no confirmed BrickLink
  number is not in the XML; it is in `skipped` with the reason.
security:
- bearerAuth:
  - read
parameters:
- name: ids
  in: query
  description: Comma-separated copy IDs (1 to 2000 unique IDs).
  schema:
    type: string
- name: copy_id
  in: query
  description: Repeated copy IDs; alternative to comma-separated ids.
  style: form
  explode: true
  schema:
    type: array
    items:
      type: string
    maxItems: 2000
    uniqueItems: true
responses:
  '200':
    description: Missing items.
    content:
      application/json:
        schema:
          type: object
          required:
          - data
          properties:
            data:
              type: array
              items:
                type: object
                required:
                - item
                - color
                - quantity
                - condition
                - bricklink
                properties:
                  item:
                    $ref: '#/components/schemas/Item'
                  color:
                    oneOf:
                    - $ref: '#/components/schemas/Color'
                    - type: 'null'
                  quantity:
                    type: integer
                  condition:
                    enum:
                    - new
                    - used
                    - null
                  bricklink:
                    description: The BrickLink type, item number and colour number
                      of the wanted-list line.
                    type: object
                    required:
                    - type
                    - 'no'
                    - color_id
                    properties:
                      type:
                        type: string
                      'no':
                        type: string
                      color_id:
                        type:
                        - integer
                        - 'null'
            skipped:
              description: Lines the XML leaves out because BrickLink cannot name
                them.
              type: array
              items:
                type: object
                required:
                - item
                - color
                - quantity
                - condition
                - why
                properties:
                  item:
                    $ref: '#/components/schemas/Item'
                  color:
                    oneOf:
                    - $ref: '#/components/schemas/Color'
                    - type: 'null'
                  quantity:
                    type: integer
                  condition:
                    enum:
                    - new
                    - used
                    - null
                  why:
                    type: string
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_export_missing_json
x-piece: M.11b

GET /export/missing.xml

BrickLink wanted-list XML of missing items for chosen copies.

Request and responses
operationId: get_export_missing_xml
summary: BrickLink wanted-list XML of missing items for chosen copies.
tags:
- Planning
security:
- bearerAuth:
  - read
parameters:
- name: copy_id
  in: query
  description: Repeated copy IDs, or use comma-separated ids (1 to 2000 unique IDs).
  style: form
  explode: true
  schema:
    type: array
    items:
      type: string
    maxItems: 2000
    uniqueItems: true
- name: ids
  in: query
  description: Comma-separated copy IDs; alternative to repeated copy_id.
  schema:
    type: string
responses:
  '200':
    description: File.
    content:
      application/xml:
        schema:
          type: string
          format: binary
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_export_missing_xml
x-piece: M.11b

GET /orders

Orders with line and receipt state.

Request and responses
operationId: get_orders
x-mcp-tool: list_orders
summary: Orders with line and receipt state.
tags:
- Orders
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_bricklink_order_id'
- $ref: '#/components/parameters/Q_status'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfOrder'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_orders
x-piece: M.11d

GET /orders/export.csv

Saved order lines (kind=lines) or one row per order with new and used totals (kind=summary) as CSV, filtered by order date and store (#44). Totals never mix currencies.

Request and responses
operationId: get_orders_export_csv
summary: Saved order lines (kind=lines) or one row per order with new and used totals
  (kind=summary) as CSV, filtered by order date and store (#44). Totals never mix
  currencies.
security:
- bearerAuth:
  - read
parameters:
- name: from
  in: query
  schema:
    type: string
    format: date
- name: to
  in: query
  schema:
    type: string
    format: date
- name: store
  in: query
  schema:
    type: string
- name: kind
  in: query
  schema:
    type: string
    enum:
    - lines
    - summary
    default: lines
responses:
  '200':
    description: 'CSV. Lines: Order, Date, Store, Seller, Item type, Item number,
      Name, Colour, Colour id, Condition, Quantity, Unit price, Line total, Currency.
      Summary: Order, Date, Store, Seller, Status, Lines, Items, New total, Used total,
      Other costs, Grand total, Currency.'
    content:
      text/csv:
        schema:
          type: string
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_orders_export_csv
x-piece: M.11d

GET /orders/{id}

Order with documents and lines.

Request and responses
operationId: get_orders_by_id
x-mcp-tool: get_order
summary: Order with documents and lines.
tags:
- Orders
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id_int'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneOrderDetail'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_orders_by_id
x-piece: M.11d

POST /orders/documents

Import an order document: pasted email, BrickLink XML, or fetch by order number with the user key.

Request and responses
operationId: post_orders_documents
x-mcp-tool: import_order
summary: 'Import an order document: pasted email, BrickLink XML, or fetch by order
  number with the user key.'
tags:
- Orders
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/OrderImport'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenOrderImportResult'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '424':
    $ref: '#/components/responses/DependencyFailed'
  '429':
    $ref: '#/components/responses/BudgetExhausted'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_orders_documents
x-piece: M.11d

PATCH /orders/{id}/lines/{line_id}

Match a line to a catalogue identity.

Request and responses
operationId: patch_orders_by_id_lines_by_line_id
summary: Match a line to a catalogue identity.
tags:
- Orders
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id_int'
- $ref: '#/components/parameters/Path_line_id_int'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/OrderLineMatch'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenReceipt'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: patch_orders_by_id_lines_by_line_id
x-piece: M.11d

PUT /orders/{id}/lines/{line_id}/hold

Hold or release a line.

Request and responses
operationId: put_orders_by_id_lines_by_line_id_hold
summary: Hold or release a line.
tags:
- Orders
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id_int'
- $ref: '#/components/parameters/Path_line_id_int'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/Hold'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenReceipt'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: put_orders_by_id_lines_by_line_id_hold
x-piece: M.11d

POST /orders/{id}/documents/{doc_id}/phase

Move a document: review, reopen or save.

Request and responses
operationId: post_orders_by_id_documents_by_doc_id_phase
summary: 'Move a document: review, reopen or save.'
tags:
- Orders
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id_int'
- $ref: '#/components/parameters/Path_doc_id_int'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/OrderPhase'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenReceipt'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_orders_by_id_documents_by_doc_id_phase
x-piece: M.11d

POST /orders/{id}/received

Record received counts per line.

Request and responses
operationId: post_orders_by_id_received
summary: Record received counts per line.
tags:
- Orders
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id_int'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/OrderReceived'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenReceipt'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_orders_by_id_received
x-piece: M.11d

POST /orders/{id}/allocate

Allocate received lines to copies or stock.

Request and responses
operationId: post_orders_by_id_allocate
summary: Allocate received lines to copies or stock.
tags:
- Orders
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id_int'
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/OrderAllocate'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenReceipt'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_orders_by_id_allocate
x-piece: M.11d

POST /orders/{id}/reconcile

Reconcile the order.

Request and responses
operationId: post_orders_by_id_reconcile
summary: Reconcile the order.
tags:
- Orders
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id_int'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenReceipt'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_orders_by_id_reconcile
x-piece: M.11d

GET /orders/{id}/short.xml

BrickLink XML of the still-missing lines.

Request and responses
operationId: get_orders_by_id_short_xml
summary: BrickLink XML of the still-missing lines.
tags:
- Orders
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id_int'
responses:
  '200':
    description: File.
    content:
      application/xml:
        schema:
          type: string
          format: binary
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_orders_by_id_short_xml
x-piece: M.11d

POST /orders/{id}/allocations/retry

Retry reviewed allocation choices atomically against current counts and gaps.

Request and responses
operationId: post_orders_by_id_allocations_retry
summary: Retry reviewed allocation choices atomically against current counts and gaps.
tags:
- Orders
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id_int'
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/OrderAllocate'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenReceipt'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_orders_by_id_allocations_retry
x-piece: M.11d

GET /orders/{id}/allocation-review

Read order allocation-review.

Request and responses
operationId: get_orders_by_id_allocation_review
summary: Read order allocation-review.
tags:
- Orders
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id_int'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfOrderReview'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_orders_by_id_allocation_review
x-piece: M.11d

GET /orders/{id}/allocations

Read order allocations.

Request and responses
operationId: get_orders_by_id_allocations
summary: Read order allocations.
tags:
- Orders
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id_int'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfAllocation'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_orders_by_id_allocations
x-piece: M.11d

GET /orders/{id}/history

Read order history.

Request and responses
operationId: get_orders_by_id_history
summary: Read order history.
tags:
- Orders
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id_int'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfOrderHistory'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_orders_by_id_history
x-piece: M.11d

GET /events

Audit events, newest first.

Request and responses
operationId: get_events
x-mcp-tool: list_events
summary: Audit events, newest first.
tags:
- Events
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_entity'
- $ref: '#/components/parameters/Q_field'
- $ref: '#/components/parameters/Q_via'
- $ref: '#/components/parameters/Q_since'
- $ref: '#/components/parameters/Q_undoable'
- $ref: '#/components/parameters/DirectionNewest'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfEvent'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_events
x-piece: M.11b

GET /events/{id}

One event with old and new values.

Request and responses
operationId: get_events_by_id
summary: One event with old and new values.
tags:
- Events
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id_int'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneEvent'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_events_by_id
x-piece: M.11b

POST /events/{id}/undo

Undo M3 collection or supported standalone core receipts. Token, source key and source toggle receipts (alone or inside an API event) require admin; other receipts require write.

Request and responses
operationId: post_events_by_id_undo
x-mcp-tool: undo_event
summary: Undo M3 collection or supported standalone core receipts. Token, source key
  and source toggle receipts (alone or inside an API event) require admin; other receipts
  require write.
tags:
- Events
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id_int'
- $ref: '#/components/parameters/IdempotencyKeyRequired'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenUndoResult'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '401':
    $ref: '#/components/responses/Unauthorized'
  '503':
    $ref: '#/components/responses/Problem'
  '403':
    $ref: '#/components/responses/Forbidden'
  '400':
    $ref: '#/components/responses/Problem'
  '428':
    $ref: '#/components/responses/Problem'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_events_by_id_undo
x-piece: M.11c

GET /jobs

Import and refresh jobs with steps.

Request and responses
operationId: get_jobs
x-mcp-tool: list_jobs
summary: Import and refresh jobs with steps.
tags:
- Jobs
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Q_state'
- $ref: '#/components/parameters/Q_failed'
- $ref: '#/components/parameters/DirectionNewest'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfJob'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_jobs
x-piece: M.11d

GET /jobs/{id}

One job.

Request and responses
operationId: get_jobs_by_id
summary: One job.
tags:
- Jobs
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id_int'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneJob'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_jobs_by_id
x-piece: M.11d

POST /jobs/{id}/retry

Retry failed steps (all, or one step). Queues the work and returns the job.

Request and responses
operationId: post_jobs_by_id_retry
x-mcp-tool: retry_job
summary: Retry failed steps (all, or one step). Queues the work and returns the job.
tags:
- Jobs
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id_int'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: false
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/JobRetry'
responses:
  '202':
    description: Accepted. The job runs in the background; poll GET /jobs/{id}.
    headers:
      Location:
        description: Poll this job.
        schema:
          type: string
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenJob'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '424':
    $ref: '#/components/responses/DependencyFailed'
  '429':
    $ref: '#/components/responses/BudgetExhausted'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_jobs_by_id_retry
x-piece: M.11d

POST /jobs/{id}/resume

Resume an interrupted or budget-waiting job.

Request and responses
operationId: post_jobs_by_id_resume
summary: Resume an interrupted or budget-waiting job.
tags:
- Jobs
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id_int'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '202':
    description: Accepted. The job runs in the background; poll GET /jobs/{id}.
    headers:
      Location:
        description: Poll this job.
        schema:
          type: string
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenJob'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '424':
    $ref: '#/components/responses/DependencyFailed'
  '429':
    $ref: '#/components/responses/BudgetExhausted'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_jobs_by_id_resume
x-piece: M.11d

POST /jobs/drain

Run one drain of due jobs in the request.

Request and responses
operationId: post_jobs_drain
summary: Run one drain of due jobs in the request.
tags:
- Jobs
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenJobList'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '424':
    $ref: '#/components/responses/DependencyFailed'
  '429':
    $ref: '#/components/responses/BudgetExhausted'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_jobs_drain
x-piece: M.11d

POST /jobs/instruction-identities

Queue identity refresh for booklets without a file.

Request and responses
operationId: post_jobs_instruction_identities
summary: Queue identity refresh for booklets without a file.
tags:
- Jobs
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '202':
    description: Accepted. The jobs run in the background; poll GET /jobs/{id}.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenJobList'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '424':
    $ref: '#/components/responses/DependencyFailed'
  '429':
    $ref: '#/components/responses/BudgetExhausted'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_jobs_instruction_identities
x-piece: M.11d

POST /jobs/pictures

Queue a picture refresh for a scope.

Request and responses
operationId: post_jobs_pictures
summary: Queue a picture refresh for a scope.
tags:
- Jobs
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/PictureRefresh'
responses:
  '202':
    description: Accepted. The job runs in the background; poll GET /jobs/{id}.
    headers:
      Location:
        description: Poll this job.
        schema:
          type: string
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenJobList'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '424':
    $ref: '#/components/responses/DependencyFailed'
  '429':
    $ref: '#/components/responses/BudgetExhausted'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_jobs_pictures
x-piece: M.11d

GET /sources

Sources with key state (configured yes or no), budget, usage today, last success and error.

Request and responses
operationId: get_sources
x-mcp-tool: get_sources
summary: Sources with key state (configured yes or no), budget, usage today, last
  success and error.
tags:
- Sources
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfSource'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_sources
x-piece: M.11d

PATCH /sources/{source}

Enable or disable a source. Undo restores the previous state.

Request and responses
operationId: patch_sources_by_source
summary: Enable or disable a source. Undo restores the previous state.
tags:
- Sources
security:
- bearerAuth:
  - admin
parameters:
- $ref: '#/components/parameters/Path_source'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/SourceToggle'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenSource'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: patch_sources_by_source
x-piece: M.11d

POST /catalogue/import

Rebuild the catalogue file from the BrickLink XML files beside the database. No path or URL parameter; not undoable.

Request and responses
operationId: post_catalogue_import
summary: Rebuild the catalogue file from the BrickLink XML files beside the database.
  No path or URL parameter; not undoable.
tags:
- Sources
security:
- bearerAuth:
  - admin
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Done.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCatalogueStatus'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_catalogue_import
x-piece: M.11d

GET /sync/{source}

Sync status per source: credentials (never their values), link, last pull, last send and what is waiting.

Request and responses
operationId: get_sync_by_source
x-mcp-tool: get_sync_status
summary: 'Sync status per source: credentials (never their values), link, last pull,
  last send and what is waiting.'
tags:
- Sync
security:
- bearerAuth:
  - read
parameters:
- name: source
  in: path
  required: true
  schema:
    type: string
    enum:
    - rebrickable
    - brickset
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneSyncStatus'
  '404':
    $ref: '#/components/responses/NotFound'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_sync_by_source
x-piece: M.11d

GET /sync/{source}/lists

The site's set lists (Rebrickable); Brickset has none. One remote call.

Request and responses
operationId: get_sync_by_source_lists
summary: The site's set lists (Rebrickable); Brickset has none. One remote call.
tags:
- Sync
security:
- bearerAuth:
  - read
parameters:
- name: source
  in: path
  required: true
  schema:
    type: string
    enum:
    - rebrickable
    - brickset
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/SyncListPage'
  '404':
    $ref: '#/components/responses/NotFound'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_sync_by_source_lists
x-piece: M.11d

PUT /sync/{source}/link

Choose the remote lists: Rebrickable owned (ids), wishlist (id), send_to (id); both: wish_list (a Brick Work wishlist).

Request and responses
operationId: put_sync_by_source_link
summary: 'Choose the remote lists: Rebrickable owned (ids), wishlist (id), send_to
  (id); both: wish_list (a Brick Work wishlist).'
tags:
- Sync
security:
- bearerAuth:
  - write
parameters:
- name: source
  in: path
  required: true
  schema:
    type: string
    enum:
    - rebrickable
    - brickset
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        type: object
        additionalProperties: false
        properties:
          owned:
            type: array
            items:
              type: integer
          wishlist:
            type:
            - integer
            - 'null'
          send_to:
            type:
            - integer
            - 'null'
          wish_list:
            type: string
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenSyncStatus'
  '404':
    $ref: '#/components/responses/NotFound'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: put_sync_by_source_link
x-piece: M.11d

POST /sync/{source}/pull/plan

Fetch the remote collection and compare: add here, only here, differs, conflict (changed in both places), unmatched. Writes nothing to the collection; the plan expires after 24 hours.

Request and responses
operationId: post_sync_by_source_pull_plan
x-mcp-tool: plan_sync_pull
summary: 'Fetch the remote collection and compare: add here, only here, differs, conflict
  (changed in both places), unmatched. Writes nothing to the collection; the plan
  expires after 24 hours.'
tags:
- Sync
security:
- bearerAuth:
  - write
parameters:
- name: source
  in: path
  required: true
  schema:
    type: string
    enum:
    - rebrickable
    - brickset
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '201':
    description: Plan created.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenSyncPlan'
  '404':
    $ref: '#/components/responses/NotFound'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_sync_by_source_pull_plan
x-piece: M.11d

POST /sync/{source}/pull/apply

Apply a pull plan: one copy per missing unit (flag imported from <site>, condition and completeness unset) and missing wishes, in one transaction. Ticked defaults to the suggested rows; conflicts only when ticked. Undo with POST /events/{id}/undo.

Request and responses
operationId: post_sync_by_source_pull_apply
x-mcp-tool: apply_sync_pull
summary: 'Apply a pull plan: one copy per missing unit (flag imported from <site>,
  condition and completeness unset) and missing wishes, in one transaction. Ticked
  defaults to the suggested rows; conflicts only when ticked. Undo with POST /events/{id}/undo.'
tags:
- Sync
security:
- bearerAuth:
  - write
parameters:
- name: source
  in: path
  required: true
  schema:
    type: string
    enum:
    - rebrickable
    - brickset
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        type: object
        additionalProperties: false
        required:
        - plan_id
        properties:
          plan_id:
            type: string
          ticked:
            type: array
            items:
              type: string
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenSyncApplied'
  '404':
    $ref: '#/components/responses/NotFound'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_sync_by_source_pull_apply
x-piece: M.11d

POST /sync/{source}/send/plan

The remote calls a send would make: set counts and wishes; removals are never ticked by default.

Request and responses
operationId: post_sync_by_source_send_plan
x-mcp-tool: plan_sync_send
summary: 'The remote calls a send would make: set counts and wishes; removals are
  never ticked by default.'
tags:
- Sync
security:
- bearerAuth:
  - write
parameters:
- name: source
  in: path
  required: true
  schema:
    type: string
    enum:
    - rebrickable
    - brickset
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '201':
    description: Plan created.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenSyncPlan'
  '404':
    $ref: '#/components/responses/NotFound'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_sync_by_source_send_plan
x-piece: M.11d

POST /sync/{source}/send/apply

Perform the ticked remote calls; each row reports sent, unchanged, failed, paused (budget) or key_rejected. Remote changes are not undone by Brick Work's Undo; re-applying retries only rows not yet sent.

Request and responses
operationId: post_sync_by_source_send_apply
summary: Perform the ticked remote calls; each row reports sent, unchanged, failed,
  paused (budget) or key_rejected. Remote changes are not undone by Brick Work's Undo;
  re-applying retries only rows not yet sent.
tags:
- Sync
security:
- bearerAuth:
  - admin
parameters:
- name: source
  in: path
  required: true
  schema:
    type: string
    enum:
    - rebrickable
    - brickset
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        type: object
        additionalProperties: false
        required:
        - plan_id
        properties:
          plan_id:
            type: string
          ticked:
            type: array
            items:
              type: string
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenSyncSent'
  '404':
    $ref: '#/components/responses/NotFound'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_sync_by_source_send_apply
x-piece: M.11d

PUT /sources/{source}/user

Store a user token (Rebrickable) or userHash (Brickset) you generated on the site. Write-only; BW_SECRET_KEY required.

Request and responses
operationId: put_sources_by_source_user
summary: Store a user token (Rebrickable) or userHash (Brickset) you generated on
  the site. Write-only; BW_SECRET_KEY required.
tags:
- Sync
security:
- bearerAuth:
  - admin
parameters:
- name: source
  in: path
  required: true
  schema:
    type: string
    enum:
    - rebrickable
    - brickset
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        type: object
        additionalProperties: false
        required:
        - value
        properties:
          value:
            type: string
            minLength: 8
            maxLength: 256
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenSyncCredentials'
  '404':
    $ref: '#/components/responses/NotFound'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: put_sources_source_user
x-piece: M.11d

DELETE /sources/{source}/user

Archive the stored user token or hash; Undo restores it.

Request and responses
operationId: delete_sources_by_source_user
summary: Archive the stored user token or hash; Undo restores it.
tags:
- Sync
security:
- bearerAuth:
  - admin
parameters:
- name: source
  in: path
  required: true
  schema:
    type: string
    enum:
    - rebrickable
    - brickset
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenSyncCredentials'
  '404':
    $ref: '#/components/responses/NotFound'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: delete_sources_source_user
x-piece: M.11d

POST /sources/{source}/user/connect

One-time connect: the username and password go straight to the site (Rebrickable POST /users/_token/, Brickset login); only the returned token or hash is stored, encrypted. The password is never stored, logged or returned.

Request and responses
operationId: post_sources_by_source_user_connect
summary: 'One-time connect: the username and password go straight to the site (Rebrickable
  POST /users/_token/, Brickset login); only the returned token or hash is stored,
  encrypted. The password is never stored, logged or returned.'
tags:
- Sync
security:
- bearerAuth:
  - admin
parameters:
- name: source
  in: path
  required: true
  schema:
    type: string
    enum:
    - rebrickable
    - brickset
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        type: object
        additionalProperties: false
        required:
        - username
        - password
        properties:
          username:
            type: string
          password:
            type: string
            format: password
            writeOnly: true
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenSyncCredentials'
  '404':
    $ref: '#/components/responses/NotFound'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_sources_source_user_connect
x-piece: M.11d

POST /sources/{source}/user/test

One remote call that proves the stored user token or hash works.

Request and responses
operationId: post_sources_by_source_user_test
summary: One remote call that proves the stored user token or hash works.
tags:
- Sync
security:
- bearerAuth:
  - admin
parameters:
- name: source
  in: path
  required: true
  schema:
    type: string
    enum:
    - rebrickable
    - brickset
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenKeyTest'
  '404':
    $ref: '#/components/responses/NotFound'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_sources_source_user_test
x-piece: M.11d

PUT /sources/{source}/key

Encrypt and store a source key (replaces a stored one). Write-only; BW_SECRET_KEY required.

Request and responses
operationId: put_sources_by_source_key
summary: Encrypt and store a source key (replaces a stored one). Write-only; BW_SECRET_KEY
  required.
tags:
- Sources
security:
- bearerAuth:
  - admin
parameters:
- $ref: '#/components/parameters/Path_source'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/SourceKeyInput'
responses:
  '200':
    description: Stored. The key value is never returned.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenSource'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '424':
    $ref: '#/components/responses/DependencyFailed'
  default:
    $ref: '#/components/responses/Problem'
x-v1: put_sources_source_key
x-piece: M.11d

DELETE /sources/{source}/key

Archive the stored key; the source stops using it and Undo restores it.

Request and responses
operationId: delete_sources_by_source_key
summary: Archive the stored key; the source stops using it and Undo restores it.
tags:
- Sources
security:
- bearerAuth:
  - admin
parameters:
- $ref: '#/components/parameters/Path_source'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Archived.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenSource'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: delete_sources_source_key
x-piece: M.11d

POST /sources/{source}/key/test

Make one budgeted call with the key in use. The result carries no key material; not undoable.

Request and responses
operationId: post_sources_by_source_key_test
summary: Make one budgeted call with the key in use. The result carries no key material;
  not undoable.
tags:
- Sources
security:
- bearerAuth:
  - admin
parameters:
- $ref: '#/components/parameters/Path_source'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: The key works.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenKeyTest'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '424':
    $ref: '#/components/responses/DependencyFailed'
  '429':
    $ref: '#/components/responses/BudgetExhausted'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_sources_source_key_test
x-piece: M.11d

GET /exchange-rates

Exchange rates per 1 EUR (hand-entered or ECB) and the display currency (#39). Stored amounts never change currency.

Request and responses
operationId: get_exchange_rates
summary: Exchange rates per 1 EUR (hand-entered or ECB) and the display currency (#39).
  Stored amounts never change currency.
security:
- bearerAuth:
  - read
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          type: object
          required:
          - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/ExchangeRate'
            display_currency:
              type: string
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_exchange_rates
x-piece: M.11d

PUT /exchange-rates/{code}

Enter (or with null remove) one rate per 1 EUR by hand.

Request and responses
operationId: put_exchange_rates_by_code
summary: Enter (or with null remove) one rate per 1 EUR by hand.
security:
- bearerAuth:
  - admin
parameters:
- name: code
  in: path
  required: true
  schema:
    type: string
    pattern: ^[A-Za-z]{3}$
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        type: object
        additionalProperties: false
        required:
        - per_eur
        properties:
          per_eur:
            type:
            - string
            - number
            - 'null'
responses:
  '200':
    description: Saved; the full rate list.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenExchangeRates'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: put_exchange_rates_by_code
x-piece: M.11d

POST /exchange-rates/ecb

Load the ECB daily reference rates (one keyless request); hand-entered rates are kept.

Request and responses
operationId: post_exchange_rates_ecb
summary: Load the ECB daily reference rates (one keyless request); hand-entered rates
  are kept.
security:
- bearerAuth:
  - admin
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Loaded.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenEcbResult'
  '502':
    $ref: '#/components/responses/Problem'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_exchange_rates_ecb
x-piece: M.11d

GET /settings

Allowed settings and freshness rules.

Request and responses
operationId: get_settings
x-mcp-tool: get_settings
summary: Allowed settings and freshness rules.
tags:
- Settings
security:
- bearerAuth:
  - read
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneSettings'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_settings
x-piece: M.11c

PATCH /settings

Update allowed settings (whitelist).

Request and responses
operationId: patch_settings
summary: Update allowed settings (whitelist).
tags:
- Settings
security:
- bearerAuth:
  - admin
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/SettingsPatch'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenSettings'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: patch_settings
x-piece: M.11c

GET /statistics

Counts by completeness, theme, storage, place.

Request and responses
operationId: get_statistics
x-mcp-tool: get_statistics
summary: Counts by completeness, theme, storage, place.
tags:
- Admin
security:
- bearerAuth:
  - read
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneStatistics'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_statistics
x-piece: M.11b

GET /database/check

Integrity, foreign-key check and row counts.

Request and responses
operationId: get_database_check
summary: Integrity, foreign-key check and row counts.
tags:
- Admin
security:
- bearerAuth:
  - admin
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneDatabaseCheck'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_database_check
x-piece: M.11d

GET /database/export

SQLite snapshot download. Stored source keys, even encrypted, are removed from the copy; refuses (409) if known plaintext credentials would remain.

Request and responses
operationId: get_database_export
summary: SQLite snapshot download. Stored source keys, even encrypted, are removed
  from the copy; refuses (409) if known plaintext credentials would remain.
tags:
- Admin
security:
- bearerAuth:
  - admin
responses:
  '200':
    description: File.
    content:
      application/vnd.sqlite3:
        schema:
          type: string
          format: binary
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_database_export
x-piece: M.11d

POST /imports/bricktracker

Upload a BrickTracker app.db (any upstream version, up to 200 MB) and get an import plan. A copy is upgraded with upstream's migrations and compared with this collection; nothing is written to the collection.

Request and responses
operationId: post_imports_bricktracker
summary: Upload a BrickTracker app.db (any upstream version, up to 200 MB) and get
  an import plan. A copy is upgraded with upstream's migrations and compared with
  this collection; nothing is written to the collection.
tags:
- Admin
security:
- bearerAuth:
  - admin
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    multipart/form-data:
      schema:
        type: object
        additionalProperties: false
        properties:
          file:
            type: string
            format: binary
        required:
        - file
responses:
  '201':
    description: Plan created (expires after 24 hours).
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenImportPlan'
  '413':
    $ref: '#/components/responses/Problem'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_imports_bricktracker
x-piece: M.11d

POST /imports/{id}/apply

Apply an import plan: rows marked add are written in one transaction; locked rows (already imported, duplicate wishes) are always skipped. Undo with POST /events/{id}/undo (admin).

Request and responses
operationId: post_imports_by_id_apply
summary: 'Apply an import plan: rows marked add are written in one transaction; locked
  rows (already imported, duplicate wishes) are always skipped. Undo with POST /events/{id}/undo
  (admin).'
tags:
- Admin
security:
- bearerAuth:
  - admin
parameters:
- name: id
  in: path
  required: true
  schema:
    type: string
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: false
  content:
    application/json:
      schema:
        type: object
        additionalProperties: false
        properties:
          decisions:
            type: object
            additionalProperties:
              type: string
              enum:
              - add
              - skip
responses:
  '200':
    description: Applied; the event id undoes the whole import.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenImportApplied'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_imports_by_id_apply
x-piece: M.11d

POST /identifications

Upload an image to Brickognize (image, up to 8 MB). Undo archives the record.

Request and responses
operationId: post_identifications
summary: Upload an image to Brickognize (image, up to 8 MB). Undo archives the record.
tags:
- Admin
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    multipart/form-data:
      schema:
        type: object
        additionalProperties: false
        properties:
          file:
            type: string
            format: binary
        required:
        - file
responses:
  '201':
    description: Identified and recorded.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenIdentification'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '424':
    $ref: '#/components/responses/DependencyFailed'
  '429':
    $ref: '#/components/responses/BudgetExhausted'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_identifications
x-piece: M.11d

GET /identifications

Photo identification history; archived rows hidden.

Request and responses
operationId: get_identifications
summary: Photo identification history; archived rows hidden.
tags:
- Admin
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfIdentification'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_identifications
x-piece: M.11d

GET /tokens

Tokens: name, scopes, created, last used, revoked. Never the secret.

Request and responses
operationId: get_tokens
summary: 'Tokens: name, scopes, created, last used, revoked. Never the secret.'
tags:
- Tokens
security:
- bearerAuth:
  - admin
parameters:
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/Direction'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfToken'
  '401':
    $ref: '#/components/responses/Unauthorized'
  '503':
    $ref: '#/components/responses/Problem'
  '403':
    $ref: '#/components/responses/Forbidden'
  '400':
    $ref: '#/components/responses/Problem'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_tokens
x-piece: M.11d

POST /tokens

Create a token. The secret is shown once in this response.

Request and responses
operationId: post_tokens
summary: Create a token. The secret is shown once in this response.
tags:
- Tokens
security:
- bearerAuth:
  - admin
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/TokenCreate'
responses:
  '201':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenTokenCreated'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  '401':
    $ref: '#/components/responses/Unauthorized'
  '503':
    $ref: '#/components/responses/Problem'
  '403':
    $ref: '#/components/responses/Forbidden'
  '400':
    $ref: '#/components/responses/Problem'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_tokens
x-piece: M.11d

DELETE /tokens/{id}

Revoke a token.

Request and responses
operationId: delete_tokens_by_id
summary: Revoke a token.
tags:
- Tokens
security:
- bearerAuth:
  - admin
parameters:
- $ref: '#/components/parameters/Path_id'
responses:
  '200':
    description: Written. One transaction, one events row.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenToken'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '401':
    $ref: '#/components/responses/Unauthorized'
  '503':
    $ref: '#/components/responses/Problem'
  '403':
    $ref: '#/components/responses/Forbidden'
  default:
    $ref: '#/components/responses/Problem'
x-v1: delete_tokens_by_id
x-piece: M.11d

POST /copies/{id}/photos

Upload an own photo (image, up to 15 MB). Undo archives it.

Request and responses
operationId: post_copies_by_id_photos
summary: Upload an own photo (image, up to 15 MB). Undo archives it.
tags:
- Copies
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    multipart/form-data:
      schema:
        type: object
        additionalProperties: false
        properties:
          file:
            type: string
            format: binary
          caption:
            type: string
        required:
        - file
responses:
  '200':
    description: OK; writes include event_id and undo_url.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCopy'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_copies_id_photos
x-piece: M.11c

POST /stock/{id}/photos

Upload an own photo (image, up to 15 MB). Undo archives it.

Request and responses
operationId: post_stock_by_id_photos
summary: Upload an own photo (image, up to 15 MB). Undo archives it.
tags:
- Loose stock
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
  required: true
  content:
    multipart/form-data:
      schema:
        type: object
        additionalProperties: false
        properties:
          file:
            type: string
            format: binary
          caption:
            type: string
        required:
        - file
responses:
  '200':
    description: OK; writes include event_id and undo_url.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenStock'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_stock_id_photos
x-piece: M.11c

DELETE /identifications/{id}

Archive identification; Undo restores it.

Request and responses
operationId: delete_identifications_by_id
summary: Archive identification; Undo restores it.
tags:
- Admin
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Archived.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenIdentification'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  default:
    $ref: '#/components/responses/Problem'
x-v1: delete_identifications_id
x-piece: M.11d

GET /identifications/{id}

Read identification result.

Request and responses
operationId: get_identifications_by_id
summary: Read identification result.
tags:
- Admin
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id'
responses:
  '200':
    description: OK; writes include event_id and undo_url.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneIdentification'
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_identifications_id
x-piece: M.11d

GET /identifications/{id}/thumb

Download identification thumbnail.

Request and responses
operationId: get_identifications_by_id_thumb
summary: Download identification thumbnail.
tags:
- Admin
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_id'
responses:
  '200':
    description: OK; writes include event_id and undo_url.
    content:
      image/jpeg:
        schema:
          type: string
          format: binary
  default:
    $ref: '#/components/responses/Problem'
x-v1: get_identifications_id_thumb
x-piece: M.11d

POST /storages/{id}/restore

Restore an archived record.

Request and responses
operationId: post_storages_by_id_restore
summary: Restore an archived record.
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Restored.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenStorage'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_storages_by_id_restore
x-piece: M.11c

POST /lots/{id}/restore

Restore an archived record.

Request and responses
operationId: post_lots_by_id_restore
summary: Restore an archived record.
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Restored.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenLot'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_lots_by_id_restore
x-piece: M.11c

POST /places/{id}/restore

Restore an archived record.

Request and responses
operationId: post_places_by_id_restore
summary: Restore an archived record.
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Restored.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenPlace'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_places_by_id_restore
x-piece: M.11c

POST /flags/{id}/restore

Restore an archived record.

Request and responses
operationId: post_flags_by_id_restore
summary: Restore an archived record.
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Restored.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenFlag'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_flags_by_id_restore
x-piece: M.11c

POST /instruction-files/{id}/restore

Restore an archived record.

Request and responses
operationId: post_instruction_files_by_id_restore
summary: Restore an archived record.
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id_int'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: Restored.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenInstructionFile'
  default:
    $ref: '#/components/responses/Problem'
x-v1: post_instruction_files_by_id_restore
x-piece: M.11c

GET /items/{id}/detail

Item detail: properties, counts, owned and wished summary, prices, matches (what v1's GET /items/{type}/{no} returned).

Request and responses
operationId: get_items_by_id_detail
summary: 'Item detail: properties, counts, owned and wished summary, prices, matches
  (what v1''s GET /items/{type}/{no} returned).'
tags:
- Items
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_item_id'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneItemDetail'
  '307':
    $ref: '#/components/responses/Moved'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11b

GET /sets/by-number/{no}

Find the item for a set number; the same item body as /items/{id} (decision 2). A set number is the same at both providers. Several items answer 409 ambiguous with the candidates, none 404.

Request and responses
operationId: get_sets_by_number_by_no
summary: Find the item for a set number; the same item body as /items/{id} (decision
  2). A set number is the same at both providers. Several items answer 409 ambiguous
  with the candidates, none 404.
tags:
- Identity
security:
- bearerAuth:
  - read
parameters:
- name: 'no'
  in: path
  required: true
  schema:
    type: string
    maxLength: 64
  description: The number in the provider space.
- $ref: '#/components/parameters/Q_provider'
- $ref: '#/components/parameters/Q_color'
responses:
  '200':
    description: The item. With a color, data.color is the resolved Brick Work colour.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneItem'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Ambiguous'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-mcp-tool: get_set_by_number
x-piece: M.11a

GET /parts/by-number/{no}

Find the item for a part number; the same item body as /items/{id} (decision 2). Default provider bricklink; provider=rebrickable for Rebrickable numbers. Several items answer 409 ambiguous with the candidates, none 404.

Request and responses
operationId: get_parts_by_number_by_no
summary: Find the item for a part number; the same item body as /items/{id} (decision
  2). Default provider bricklink; provider=rebrickable for Rebrickable numbers. Several
  items answer 409 ambiguous with the candidates, none 404.
tags:
- Identity
security:
- bearerAuth:
  - read
parameters:
- name: 'no'
  in: path
  required: true
  schema:
    type: string
    maxLength: 64
  description: The number in the provider space.
- $ref: '#/components/parameters/Q_provider'
- $ref: '#/components/parameters/Q_color'
responses:
  '200':
    description: The item. With a color, data.color is the resolved Brick Work colour.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneItem'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Ambiguous'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-mcp-tool: get_part_by_number
x-piece: M.11a

GET /minifigures/by-number/{no}

Find the item for a minifigure number; the same item body as /items/{id} (decision 2). Default provider bricklink; provider=rebrickable for Rebrickable numbers. Several items answer 409 ambiguous with the candidates, none 404.

Request and responses
operationId: get_minifigures_by_number_by_no
summary: Find the item for a minifigure number; the same item body as /items/{id}
  (decision 2). Default provider bricklink; provider=rebrickable for Rebrickable numbers.
  Several items answer 409 ambiguous with the candidates, none 404.
tags:
- Identity
security:
- bearerAuth:
  - read
parameters:
- name: 'no'
  in: path
  required: true
  schema:
    type: string
    maxLength: 64
  description: The number in the provider space.
- $ref: '#/components/parameters/Q_provider'
- $ref: '#/components/parameters/Q_color'
responses:
  '200':
    description: The item. With a color, data.color is the resolved Brick Work colour.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneItem'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Ambiguous'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-mcp-tool: get_minifigure_by_number
x-piece: M.11a

GET /lookup

Find the item for any provider number: provider, kind and key (and a colour in the provider space). Same body and errors as the by-number paths.

Request and responses
operationId: get_lookup
summary: 'Find the item for any provider number: provider, kind and key (and a colour
  in the provider space). Same body and errors as the by-number paths.'
tags:
- Identity
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Q_provider'
- name: kind
  in: query
  required: true
  schema:
    $ref: '#/components/schemas/Kind'
- name: key
  in: query
  required: true
  schema:
    type: string
    maxLength: 64
- $ref: '#/components/parameters/Q_color'
responses:
  '200':
    description: The item. With a color, data.color is the resolved Brick Work colour.
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/OneItem'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Ambiguous'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-mcp-tool: lookup_item
x-piece: M.11a

GET /items/{id}/links

The item's provider links with status, method, origin, preferred and colour scope (design 3.2), to-check candidates included.

Request and responses
operationId: get_items_by_id_links
summary: The item's provider links with status, method, origin, preferred and colour
  scope (design 3.2), to-check candidates included.
tags:
- Identity
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_item_id'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfItemLink'
  '307':
    $ref: '#/components/responses/Moved'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11b

PUT /items/{id}/links

Set one manual link of the item, or make one preferred for its colour scope (design 3.2). Idempotent per (provider, type, number, colour).

Request and responses
operationId: put_items_by_id_links
summary: Set one manual link of the item, or make one preferred for its colour scope
  (design 3.2). Idempotent per (provider, type, number, colour).
tags:
- Identity
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_item_id'
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/ItemLinkWrite'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenItemLink'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Merged'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11c

GET /items/{id}/provider-status

What is known about the item at a provider when there is no key: looked and nothing found, to check without candidate, kind differs (design 3.2).

Request and responses
operationId: get_items_by_id_provider_status
summary: 'What is known about the item at a provider when there is no key: looked
  and nothing found, to check without candidate, kind differs (design 3.2).'
tags:
- Identity
security:
- bearerAuth:
  - read
parameters:
- $ref: '#/components/parameters/Path_item_id'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfItemProviderStatus'
  '307':
    $ref: '#/components/responses/Moved'
  '404':
    $ref: '#/components/responses/NotFound'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11b

GET /links

Links and provider statuses across items, by status: status=to_check is the list that replaces v1's /unresolved.

Request and responses
operationId: get_links
summary: 'Links and provider statuses across items, by status: status=to_check is
  the list that replaces v1''s /unresolved.'
tags:
- Identity
security:
- bearerAuth:
  - read
parameters:
- name: status
  in: query
  schema:
    type: string
    enum:
    - matched
    - inferred
    - manual
    - to_check
- name: provider
  in: query
  schema:
    type: string
- $ref: '#/components/parameters/Q_item_kind'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/Limit'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ListOfLinkRow'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11b

POST /items/{id}/merge

Merge this local item into a survivor (design 3.6): every reference moves, the id answers 307 to the survivor afterwards. Refused for a live catalogue item.

Request and responses
operationId: post_items_by_id_merge
summary: 'Merge this local item into a survivor (design 3.6): every reference moves,
  the id answers 307 to the survivor afterwards. Refused for a live catalogue item.'
tags:
- Identity
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_item_id'
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/MergeRequest'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenMerge'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11c

POST /items/{id}/unmerge

Undo a merge by its receipt (design 3.6): the merged id answers for itself again. Refused if a moved row changed since.

Request and responses
operationId: post_items_by_id_unmerge
summary: 'Undo a merge by its receipt (design 3.6): the merged id answers for itself
  again. Refused if a moved row changed since.'
tags:
- Identity
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_item_id'
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: false
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/UnmergeRequest'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenMerge'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11c

POST /items/{id}/change-variant

Change the variant (#151): everything owned of this catalogue item (loose stock, wishes, figure lines of copies with their part lists) moves to another item of the same kind, and BrickLink's number becomes the other item's preferred link. One event; Undo puts every row back. Refused for a merged item, another kind, a set, a job in flight, and rows that would meet on a key.

Request and responses
operationId: post_items_by_id_change_variant
summary: 'Change the variant (#151): everything owned of this catalogue item (loose
  stock, wishes, figure lines of copies with their part lists) moves to another item
  of the same kind, and BrickLink''s number becomes the other item''s preferred link.
  One event; Undo puts every row back. Refused for a merged item, another kind, a
  set, a job in flight, and rows that would meet on a key.'
tags:
- Identity
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_item_id'
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/ChangeVariantRequest'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenVariantChange'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11c

POST /items/{id}/build

Build it (#9): make a copy of this set from the loose stock, moving the matching parts and whole figures into it; one event, Undo puts the stock back and archives the copy.

Request and responses
operationId: post_items_by_id_build
summary: 'Build it (#9): make a copy of this set from the loose stock, moving the
  matching parts and whole figures into it; one event, Undo puts the stock back and
  archives the copy.'
description: 'Builds one copy of the set from the catalogue''s latest Rebrickable
  part list: every part line and whole figure the chosen stock covers is moved out
  of it into the copy (the largest usable row first, then the lowest id), the rest
  is recorded as missing on the copy, and one `stock_transfer` row per move is kept.
  The stock is the one Build Scout counts (`GET /planning/build-scout`): damaged rows
  give nothing unless `damaged` is true. Refused with 422 for a set made of other
  sets, a set with no part list and sources that hold nothing the set needs. The event
  is `copy` / `make_from_stock`; Undo (`POST /events/{id}/undo`) puts the stock back
  and archives the copy, and is refused when the copy or the stock changed since.'
tags:
- Copies
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_item_id'
- $ref: '#/components/parameters/IdempotencyKeyRequired'
requestBody:
  required: false
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/BuildFromStockRequest'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenBuild'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11c

POST /copies/{id}/inventory

Switch the copy's part list in place (design 4.4): to Rebrickable (a version) or BrickLink. A BrickLink switch is pending until its fetch job lands.

Request and responses
operationId: post_copies_by_id_inventory
summary: 'Switch the copy''s part list in place (design 4.4): to Rebrickable (a version)
  or BrickLink. A BrickLink switch is pending until its fetch job lands.'
tags:
- Copies
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKeyRequired'
- $ref: '#/components/parameters/IfMatch'
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/CopyInventorySwitch'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCopy'
  '202':
    description: 'Pending: the BrickLink list is being fetched (the Job is data.inventory.pending).'
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCopy'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  '412':
    $ref: '#/components/responses/PreconditionFailed'
  '422':
    $ref: '#/components/responses/Invalid'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11c

DELETE /copies/{id}/inventory/pending

Cancel a pending BrickLink switch (design 4.4): the copy keeps its current list.

Request and responses
operationId: delete_copies_by_id_inventory_pending
summary: 'Cancel a pending BrickLink switch (design 4.4): the copy keeps its current
  list.'
tags:
- Copies
security:
- bearerAuth:
  - write
parameters:
- $ref: '#/components/parameters/Path_id'
- $ref: '#/components/parameters/IdempotencyKey'
responses:
  '200':
    description: OK
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/WrittenCopy'
  '404':
    $ref: '#/components/responses/NotFound'
  '409':
    $ref: '#/components/responses/Conflict'
  default:
    $ref: '#/components/responses/Problem'
x-piece: M.11c

Shared schemas and authentication

securitySchemes:
  bearerAuth:
    type: http
    scheme: bearer
    description: 'Authorization: Bearer <token>. Scopes: read, write, admin (admin
      includes write, write includes read). Listed per operation.'
parameters:
  Cursor:
    name: cursor
    in: query
    schema:
      type: string
    description: Opaque cursor from page.next_cursor.
  Limit:
    name: limit
    in: query
    schema:
      type: integer
      minimum: 1
      maximum: 200
      default: 50
  DirectionNewest:
    name: direction
    in: query
    schema:
      type: string
      enum:
      - asc
      - desc
      default: desc
  Direction:
    name: direction
    in: query
    schema:
      type: string
      enum:
      - asc
      - desc
      default: asc
  IdempotencyKey:
    name: Idempotency-Key
    in: header
    required: false
    schema:
      type: string
      maxLength: 80
      pattern: ^[A-Za-z0-9-]{1,80}$
    description: Optional replay protection (see api-v1.md).
  IdempotencyKeyRequired:
    name: Idempotency-Key
    in: header
    required: true
    schema:
      type: string
      maxLength: 80
      pattern: ^[A-Za-z0-9-]{1,80}$
    description: 'Required: the operation creates records or moves quantities.'
  IfMatch:
    name: If-Match
    in: header
    required: false
    schema:
      type: string
    description: ETag from the last read; mismatch gives 412.
  Q_q:
    name: q
    in: query
    schema:
      type: string
    description: Text over name, number, colour, category, theme, year (case-insensitive
      substring, as the web lists).
  Q_sort:
    name: sort
    in: query
    schema:
      type: string
    description: One of number, name, year, quantity, missing, damaged, used_price,
      colour, added. Default number; planning defaults to ranking (core group, pin,
      ratio and gain order). `added` (on /copies) is when the copy was added to Brick
      Work.
  Path_color_id_int:
    name: color_id
    in: path
    required: true
    schema:
      type: integer
  Q_theme:
    name: theme
    in: query
    schema:
      type: string
    description: Theme name.
  Q_category:
    name: category
    in: query
    schema:
      type: string
    description: Category name.
  Q_year:
    name: year
    in: query
    schema:
      type: string
    description: Year.
  Q_owned:
    name: owned
    in: query
    schema:
      type: string
    description: true to list only owned items.
  Path_id_int:
    name: id
    in: path
    required: true
    schema:
      type: integer
  Path_image_id:
    name: id
    in: path
    required: true
    description: A cached provider picture's number, or an own photo's 32-character
      hex id (`Image.id`).
    schema:
      oneOf:
      - type: integer
      - type: string
        pattern: ^[0-9a-f]{32}$
  Q_condition:
    name: condition
    in: query
    schema:
      type: string
    description: new, used, damaged for copies and stock; new, used, any for wishes.
  Q_status:
    name: status
    in: query
    schema:
      type: string
    description: Completeness sealed, complete, incomplete or unknown (copies); order
      status (orders).
  Q_storage:
    name: storage
    in: query
    schema:
      type: string
    description: Storage id, or null for Not stored.
  Q_place:
    name: place
    in: query
    schema:
      type: string
    description: Purchase location id, or null.
  Q_flag:
    name: flag
    in: query
    schema:
      type: string
    description: Flag id.
  Q_lot:
    name: lot
    in: query
    schema:
      type: string
    description: Lot id, or null for none.
  Q_problem:
    name: problem
    in: query
    schema:
      type: string
    description: missing or damaged.
  Q_duplicates:
    name: duplicates
    in: query
    schema:
      type: string
    description: true for several copies, false for one.
  Q_archived:
    name: archived
    in: query
    schema:
      type: string
    description: true or include (default exclude), or only.
  Path_id:
    name: id
    in: path
    required: true
    schema:
      type: string
  Path_stock_id:
    name: stock_id
    in: path
    required: true
    schema:
      type: string
  Q_spare:
    name: spare
    in: query
    schema:
      type: string
    description: 0 or 1.
  Q_parent:
    name: parent
    in: query
    schema:
      type: string
    description: Parent figure number.
  Path_part_id_int:
    name: part_id
    in: path
    required: true
    schema:
      type: integer
  Q_inventory:
    name: inventory
    in: query
    schema:
      type: string
    description: parts, figures or instructions (web Inventory tabs).
  Q_kind:
    name: kind
    in: query
    schema:
      type: string
    description: Kind filter.
  Q_source:
    name: source
    in: query
    schema:
      type: string
    description: Source key.
  Q_source_id:
    name: source_id
    in: query
    schema:
      type: string
    description: Source identifier.
  Q_copy_id:
    name: copy_id
    in: query
    schema:
      type: string
    description: Copy id (repeatable where an export).
  Q_completes:
    name: completes
    in: query
    schema:
      type: string
    description: true to keep only matches that complete a copy.
  Q_has_file:
    name: has_file
    in: query
    schema:
      type: string
    description: true to keep the file records whose PDF is on disk, false those whose
      PDF is missing from the media folder.
  Q_guide:
    name: guide
    in: query
    schema:
      type: string
    description: sold, stock, retail, manual or valuation.
  Q_under_max:
    name: under_max
    in: query
    schema:
      type: string
    description: true to keep wishes priced under their maximum.
  Q_move_to_unstored:
    name: move_to_unstored
    in: query
    schema:
      type: string
    description: true to move contents to Not stored when archiving.
  Q_confirm:
    name: confirm
    in: query
    schema:
      type: string
    description: The reference count shown by the preceding read; deletion is refused
      if it differs.
  Q_bricklink_order_id:
    name: bricklink_order_id
    in: query
    schema:
      type: string
    description: BrickLink order number.
  Path_line_id_int:
    name: line_id
    in: path
    required: true
    schema:
      type: integer
  Path_doc_id_int:
    name: doc_id
    in: path
    required: true
    schema:
      type: integer
  Q_entity:
    name: entity
    in: query
    schema:
      type: string
    description: Event entity prefix.
  Q_field:
    name: field
    in: query
    schema:
      type: string
    description: Event field.
  Q_via:
    name: via
    in: query
    schema:
      type: string
    description: app, cli, api, import or migration.
  Q_since:
    name: since
    in: query
    schema:
      type: string
    description: ISO-8601 timestamp; events at or after.
  Q_undoable:
    name: undoable
    in: query
    schema:
      type: string
    description: true to keep events that can still be undone.
  Q_state:
    name: state
    in: query
    schema:
      type: string
    description: Job state.
  Q_failed:
    name: failed
    in: query
    schema:
      type: string
    description: true for jobs with a failed step.
  Path_source:
    name: source
    in: path
    required: true
    schema:
      type: string
  Path_item_id:
    name: id
    in: path
    required: true
    x-mcp-item: true
    schema:
      type: integer
      minimum: 1
    description: 'Brick Work item id. Ids are per install (design 3.1): store numbers,
      not ids.'
  Path_set_item_id:
    name: set_id
    in: path
    required: true
    x-mcp-item: true
    schema:
      type: integer
      minimum: 1
    description: Brick Work item id of the set.
  Path_figure_item_id:
    name: item_id
    in: path
    required: true
    x-mcp-item: true
    schema:
      type: integer
      minimum: 1
    description: Brick Work item id of the figure.
  Path_wish_id:
    name: id
    in: path
    required: true
    schema:
      type: string
    description: Wish uuid (Q6).
  Path_wishlist_id:
    name: id
    in: path
    required: true
    schema:
      type: string
    description: Wishlist id.
  Q_item_kind:
    name: kind
    in: query
    schema:
      $ref: '#/components/schemas/Kind'
    description: Item kind.
  Q_provider:
    name: provider
    in: query
    schema:
      type: string
      enum:
      - bricklink
      - rebrickable
      - brickwork
      default: bricklink
    description: 'The space numbers and colours are given in (decision 3 and 4): bricklink
      (default), rebrickable, or brickwork (Brick Work ids; colours on /items/{id}
      paths).'
  Q_number:
    name: number
    in: query
    schema:
      type: string
    description: Item number in the provider space.
  Q_color:
    name: color
    in: query
    schema:
      type: integer
    description: Colour id in the provider space (decision 4).
responses:
  Problem:
    description: Any other error, including 401 unauthorized, 403 forbidden and 5xx.
      Always application/problem+json with a stable code.
    content:
      application/problem+json:
        schema:
          $ref: '#/components/schemas/Problem'
  Unauthorized:
    description: No token, bad token, revoked or expired token.
    content:
      application/problem+json:
        schema:
          $ref: '#/components/schemas/Problem'
  Forbidden:
    description: Token lacks the scope, or the instance is read only.
    content:
      application/problem+json:
        schema:
          $ref: '#/components/schemas/Problem'
  NotFound:
    description: No such record.
    content:
      application/problem+json:
        schema:
          $ref: '#/components/schemas/Problem'
  MethodNotAllowed:
    description: Method not supported for this path (405 method_not_allowed).
    headers:
      Allow:
        description: Supported HTTP methods for this path.
        required: true
        schema:
          type: string
    content:
      application/problem+json:
        schema:
          $ref: '#/components/schemas/Problem'
  Conflict:
    description: State changed, duplicate, idempotency key reused with another body,
      or Undo blocked by a later change.
    content:
      application/problem+json:
        schema:
          $ref: '#/components/schemas/Problem'
  Invalid:
    description: Validation failed; errors[] names the fields.
    content:
      application/problem+json:
        schema:
          $ref: '#/components/schemas/Problem'
  PreconditionFailed:
    description: If-Match did not match the current ETag.
    content:
      application/problem+json:
        schema:
          $ref: '#/components/schemas/Problem'
  DependencyFailed:
    description: Key, source or catalogue not configured (source_not_configured, source_disabled,
      catalogue_not_loaded).
    content:
      application/problem+json:
        schema:
          $ref: '#/components/schemas/Problem'
  BudgetExhausted:
    description: Daily budget or remote throttle; Retry-After header and retry_after
      field; job_id when a job holds the call.
    headers:
      Retry-After:
        schema:
          type: integer
    content:
      application/problem+json:
        schema:
          $ref: '#/components/schemas/Problem'
  Moved:
    description: 'The id was merged away: 307 to the survivor, never cached (merges
      can be undone).'
    headers:
      Location:
        schema:
          type: string
      Cache-Control:
        schema:
          type: string
          enum:
          - no-store
    content:
      application/problem+json:
        schema:
          $ref: '#/components/schemas/Problem'
  Ambiguous:
    description: The number names several items; candidates lists them.
    content:
      application/problem+json:
        schema:
          $ref: '#/components/schemas/Problem'
  Merged:
    description: The id was merged away; survivor names the live item. Write to it.
    content:
      application/problem+json:
        schema:
          $ref: '#/components/schemas/Problem'
  Unidentified:
    description: The number resolves to no item and the request cannot create one.
    content:
      application/problem+json:
        schema:
          $ref: '#/components/schemas/Problem'
  NotImplemented:
    description: The operation arrives with the piece named in the body.
    content:
      application/problem+json:
        schema:
          $ref: '#/components/schemas/Problem'
schemas:
  FieldError:
    type: object
    properties:
      field:
        type: string
      code:
        type: string
      message:
        type: string
    required:
    - field
    - code
  PageInfo:
    type: object
    properties:
      next_cursor:
        type:
        - string
        - 'null'
      limit:
        type: integer
      total:
        type:
        - integer
        - 'null'
    required:
    - limit
  Health:
    type: object
    properties:
      status:
        type: string
        enum:
        - ok
        - degraded
      api:
        type: string
      app:
        type: string
        description: The running Brick Work version, as in /version.
      schema:
        type: string
      catalogue_loaded:
        type: boolean
    required:
    - status
    - api
  Version:
    type: object
    properties:
      api:
        type: string
      app:
        type: string
      schema:
        type: string
      read_only:
        type: boolean
      features:
        type: array
        items:
          type: string
    required:
    - api
  Me:
    type: object
    properties:
      name:
        type: string
      scopes:
        type: array
        items:
          type: string
      expires_at:
        type:
        - string
        - 'null'
        format: date-time
    required:
    - name
    - scopes
  Token:
    type: object
    properties:
      id:
        type: string
      name:
        type: string
      scopes:
        type: array
        items:
          type: string
      created_at:
        type: string
        format: date-time
      last_used_at:
        type:
        - string
        - 'null'
        format: date-time
      expires_at:
        type:
        - string
        - 'null'
        format: date-time
      revoked_at:
        type:
        - string
        - 'null'
        format: date-time
    required:
    - id
    - name
    - scopes
  TokenCreate:
    type: object
    additionalProperties: false
    properties:
      name:
        type: string
        minLength: 1
        maxLength: 80
      scopes:
        type: array
        minItems: 1
        items:
          type: string
          enum:
          - read
          - write
          - admin
      expires_at:
        type:
        - string
        - 'null'
        format: date-time
    required:
    - name
    - scopes
  TokenCreated:
    type: object
    properties:
      token:
        $ref: '#/components/schemas/Token'
      secret:
        type:
        - string
        - 'null'
    required:
    - token
    - secret
    description: secret is returned once and never again; the answer a replay of the
      same request gets has it null (the replay record never holds it).
  CatalogueItem:
    type: object
    properties:
      item:
        $ref: '#/components/schemas/Item'
      name:
        type:
        - string
        - 'null'
      year:
        type:
        - integer
        - 'null'
      owned:
        type: integer
      wished:
        type: boolean
      category:
        type:
        - string
        - 'null'
      theme:
        type:
        - string
        - 'null'
        description: The Rebrickable theme of a set or minifigure from the catalogue
          (a part has none). Item properties fetched later may name another.
    required:
    - item
  ItemDetail:
    type: object
    properties:
      item:
        $ref: '#/components/schemas/Item'
      properties: {}
      counts:
        type: object
        properties:
          owned:
            type: integer
          wished:
            type: boolean
        required:
        - owned
        - wished
      copies:
        type: array
        items:
          $ref: '#/components/schemas/Copy'
      stock:
        type: array
        items:
          $ref: '#/components/schemas/Stock'
      wishes:
        type: array
        items:
          $ref: '#/components/schemas/Wish'
      prices: {}
      inventory:
        type: array
        items:
          $ref: '#/components/schemas/InventoryLine'
      links:
        type: array
        items:
          $ref: '#/components/schemas/ItemLink'
      used_in:
        description: The live copies that hold the item (a part or a figure), as `GET
          /items/{id}/used-in`.
        type: array
        items:
          $ref: '#/components/schemas/UsedIn'
      gaps:
        description: The gaps on this item, and (for a set) the gaps of its copies,
          as `GET /gaps`.
        type: array
        items:
          $ref: '#/components/schemas/Gap'
      matches:
        description: The loose stock that fills those gaps, as `GET /matches`.
        type: array
        items:
          $ref: '#/components/schemas/Match'
    required:
    - item
  InventoryLine:
    type: object
    properties:
      child:
        $ref: '#/components/schemas/Item'
      name:
        type:
        - string
        - 'null'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      quantity:
        type:
        - integer
        - 'null'
      extra_quantity:
        type: integer
      source:
        type: string
  UsedIn:
    type: object
    properties:
      copy_id:
        type: string
      item:
        $ref: '#/components/schemas/Item'
      name:
        type:
        - string
        - 'null'
      quantity:
        type:
        - integer
        - 'null'
      missing:
        type:
        - integer
        - 'null'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
  Image:
    type: object
    properties:
      id:
        description: The picture number of a cached provider picture, the 32-character
          hex id of an own photo.
        oneOf:
        - type: integer
        - type: string
      item:
        $ref: '#/components/schemas/Item'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      source:
        type: string
      kind:
        type: string
        enum:
        - photo
        - render
        - box
        - booklet
        - own
      width:
        type:
        - integer
        - 'null'
      height:
        type:
        - integer
        - 'null'
      fetched_at:
        type:
        - string
        - 'null'
        format: date-time
      copy_id:
        type:
        - string
        - 'null'
      stock_id:
        type:
        - string
        - 'null'
      caption:
        type:
        - string
        - 'null'
      content_url:
        type: string
    required:
    - id
  ImportRequest:
    type: object
    additionalProperties: false
    properties:
      steps:
        type: array
        minItems: 1
        items:
          type: string
          enum:
          - identity
          - inventory
          - matching
          - pictures
          - metadata
          - market_price
    description: Optional step subset; default is the stored import order for the
      item's kind. The sources of a step are the stored order of its kind.
  CopyCreate:
    type: object
    properties:
      item:
        allOf:
        - $ref: '#/components/schemas/ItemKey'
        description: The item, by number (decision 3) or by id.
      quantity:
        type: integer
      condition:
        type: string
        enum:
        - new
        - used
      completeness:
        type: string
        enum:
        - sealed
        - complete
        - incomplete
      decision:
        type: string
        enum:
        - another
        - skip
      storage_id:
        type:
        - string
        - 'null'
      purchase_location_id:
        type:
        - string
        - 'null'
      purchase_date:
        type:
        - string
        - 'null'
        description: ISO-8601 date or date-time, as stored.
      purchase_price:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      purchase_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
    required:
    - item
  CopyPatch:
    type: object
    properties:
      condition:
        type: string
        enum:
        - new
        - used
      completeness:
        type: string
        enum:
        - sealed
        - complete
        - incomplete
      completeness_source:
        type: string
        enum:
        - manual
        - derived
      storage_id:
        type:
        - string
        - 'null'
      purchase_location_id:
        type:
        - string
        - 'null'
      purchase_date:
        type:
        - string
        - 'null'
        description: ISO-8601 date or date-time, as stored.
      purchase_price:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      purchase_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      current_value:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      current_value_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      note:
        type:
        - string
        - 'null'
    description: Only these fields; at least one. null clears.
  FlagSet:
    type: object
    properties:
      flags:
        type: array
        items:
          type: string
    required:
    - flags
  Pin:
    type: object
    properties:
      pinned:
        type: boolean
    required:
    - pinned
  Checked:
    type: object
    properties:
      checked:
        type: boolean
    required:
    - checked
    additionalProperties: false
  Completeness:
    type: object
    properties:
      stored:
        type:
        - string
        - 'null'
        enum:
        - sealed
        - complete
        - incomplete
        - null
      completeness_source:
        type: string
        enum:
        - manual
        - derived
      derived:
        type:
        - string
        - 'null'
        enum:
        - sealed
        - complete
        - incomplete
        - null
      checked:
        type: boolean
      missing:
        type: integer
      damaged:
        type: integer
      missing_figures:
        type: integer
    required:
    - stored
  CheckState:
    type: object
    properties:
      session:
        description: The saved part-check session (id, order, cursor, answers, misses,
          undo, finished, sort, spares, scope, saved_at; `scope` is `missing` for
          a missing-only run, `skipped` for a walk of the skipped parts, null for
          the whole set), or null when none was started.
      rows:
        description: The sequence of the check. One entry per required part line (kind
          part), whole figure (figure) and spare line (spare) with token, id, item,
          name, color, quantity, missing, damaged, checked and image_id; a figure
          carries parts_lines and parts_missing.
  CheckAction:
    type: object
    properties:
      action:
        type: string
        enum:
        - start
        - answer
        - found_one
        - skip
        - select
        - back
        - next
        - spares
        - recheck
        - finish
        - undo
      token:
        type: string
      session:
        type: string
      found:
        type: integer
      include:
        type: boolean
      checked:
        type: boolean
      order:
        type: string
        enum:
        - inventory
        - largest
        - colour
      scope:
        type: string
        description: 'start only: `all` walks the whole set (a fresh start without
          `scope` does too); `missing` walks only the parts the last check left missing
          (the others keep their answers; refused with 422 when none is missing).
          Left out, a start resumes the running check; a named scope that is not the
          running one replaces it (Undo brings it back).'
        enum:
        - all
        - missing
      tokens:
        type: array
        description: 'recheck only: the skipped lines to walk (default: every skipped
          one).'
        items:
          type: string
    required:
    - action
  Gap:
    description: What a copy or a loose figure lacks. For a missing booklet or box
      (`instructions`, `box`) the item is the copy's set and `target_id` is the copy
      id; for a part, a figure or a loose figure's part it is the item missing and
      `target_id` the line id.
    type: object
    properties:
      copy_id:
        type: string
      item:
        $ref: '#/components/schemas/Item'
      name:
        type:
        - string
        - 'null'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      target:
        type: string
        enum:
        - part
        - figure
        - stock-part
        - instructions
        - box
      target_id: {}
      need:
        type: integer
      unresolved:
        type: boolean
  Match:
    type: object
    properties:
      source_id:
        type: string
      copy_id:
        type: string
      target:
        type: string
      target_id: {}
      item:
        $ref: '#/components/schemas/Item'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      have:
        type: integer
      suggested:
        type: integer
      completes:
        type: boolean
  Take:
    type: object
    description: A part (P) needs its colour; a whole minifigure (M) has none (omit
      color_id or send null).
    properties:
      item:
        allOf:
        - $ref: '#/components/schemas/ItemKey'
        description: The item, by number (decision 3) or by id.
      color:
        type:
        - integer
        - 'null'
        description: 'A colour in the provider space of the item key (decision 4):
          a BrickLink colour id with provider bricklink, a Rebrickable colour id with
          rebrickable, a Brick Work colour id when the item is named by id.'
      quantity:
        type: integer
    required:
    - item
    - quantity
  Give:
    type: object
    properties:
      copy_id:
        type: string
      target:
        type: string
        enum:
        - part
        - figure
        - stock-part
        - instructions
        - box
      target_id: {}
      quantity:
        type: integer
    required:
    - copy_id
    - target
    - target_id
    - quantity
  Booklets:
    type: object
    properties:
      text:
        type: string
      quantity:
        type: integer
    required:
    - text
  Found:
    type: object
    properties:
      item:
        allOf:
        - $ref: '#/components/schemas/ItemKey'
        description: The item, by number (decision 3) or by id.
      color:
        type:
        - integer
        - 'null'
        description: 'A colour in the provider space of the item key (decision 4):
          a BrickLink colour id with provider bricklink, a Rebrickable colour id with
          rebrickable, a Brick Work colour id when the item is named by id.'
      destination:
        type: string
        enum:
        - set
        - loose
        - list
      quantity:
        type: integer
      assignments: {}
    required:
    - item
    - color
    - destination
    - quantity
  Receipt:
    type: object
    properties:
      event_id:
        type: integer
      message:
        type: string
    required:
    - event_id
  CopyPart:
    type: object
    properties:
      id:
        type: integer
      copy_id:
        type: string
      parent_minifig:
        oneOf:
        - $ref: '#/components/schemas/Item'
        - type: 'null'
      item:
        $ref: '#/components/schemas/Item'
      name:
        type:
        - string
        - 'null'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      spare:
        type:
        - integer
        - 'null'
      quantity:
        type:
        - integer
        - 'null'
      missing:
        type:
        - integer
        - 'null'
      damaged:
        type:
        - integer
        - 'null'
      checked:
        type:
        - boolean
        - 'null'
    required:
    - id
  CopyPartPatch:
    type: object
    properties:
      missing:
        type: integer
        minimum: 0
      damaged:
        type: integer
        minimum: 0
      checked:
        type: boolean
    additionalProperties: false
    minProperties: 1
  CopyPartBulk:
    type: object
    properties:
      items:
        type: array
        items:
          $ref: '#/components/schemas/CopyPartBulkItem'
        minItems: 1
        maxItems: 500
      mode:
        type: string
        enum:
        - set
        - add
        default: set
      dry_run:
        type: boolean
        default: false
    required:
    - items
    additionalProperties: false
  CopyPartBulkItem:
    type: object
    properties:
      item:
        allOf:
        - $ref: '#/components/schemas/ItemKey'
        description: The item, by number (decision 3) or by id.
      color:
        type:
        - integer
        - 'null'
        description: 'A colour in the provider space of the item key (decision 4):
          a BrickLink colour id with provider bricklink, a Rebrickable colour id with
          rebrickable, a Brick Work colour id when the item is named by id.'
      missing:
        type: integer
        minimum: 0
    required:
    - item
    - color
    - missing
    additionalProperties: false
  BulkResult:
    type: object
    properties:
      applied:
        type: integer
      skipped:
        type: array
        items:
          $ref: '#/components/schemas/FieldError'
      dry_run:
        type: boolean
      event_id:
        type:
        - integer
        - 'null'
  CopyFigure:
    type: object
    properties:
      item:
        $ref: '#/components/schemas/Item'
      name:
        type:
        - string
        - 'null'
      quantity:
        type:
        - integer
        - 'null'
      missing:
        type:
        - integer
        - 'null'
      parts_lines:
        type: integer
      parts_missing:
        type: integer
  CopyFigurePatch:
    type: object
    properties:
      missing:
        type: integer
        minimum: 0
    required:
    - missing
    additionalProperties: false
  Stock:
    type: object
    properties:
      id:
        type: string
      item:
        $ref: '#/components/schemas/Item'
      name:
        type:
        - string
        - 'null'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      quantity:
        type:
        - integer
        - 'null'
      condition:
        type:
        - string
        - 'null'
        enum:
        - new
        - used
        - damaged
        - null
      storage_id:
        type:
        - string
        - 'null'
      lot_id:
        type:
        - string
        - 'null'
      purchase_location_id:
        type:
        - string
        - 'null'
      purchase_date:
        type:
        - string
        - 'null'
        description: ISO-8601 date or date-time, as stored.
      purchase_price:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      purchase_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      note:
        type:
        - string
        - 'null'
      created_at:
        type:
        - string
        - 'null'
        format: date-time
      updated_at:
        type:
        - string
        - 'null'
        format: date-time
      archived_at:
        type:
        - string
        - 'null'
        format: date-time
      missing:
        type:
        - integer
        - 'null'
      damaged:
        type:
        - integer
        - 'null'
      flags:
        type: array
        items:
          type: string
      merged_ids:
        type: array
        items:
          type: string
      etag:
        type: string
      image_id:
        type:
        - integer
        - 'null'
    required:
    - id
    - item
  StockCreate:
    type: object
    properties:
      item:
        allOf:
        - $ref: '#/components/schemas/ItemKey'
        description: The item, by number (decision 3) or by id.
      color:
        type:
        - integer
        - 'null'
        description: 'A colour in the provider space of the item key (decision 4):
          a BrickLink colour id with provider bricklink, a Rebrickable colour id with
          rebrickable, a Brick Work colour id when the item is named by id.'
      quantity:
        type: integer
      condition:
        type: string
        enum:
        - new
        - used
        - damaged
      storage_id:
        type:
        - string
        - 'null'
      lot_id:
        type:
        - string
        - 'null'
      note:
        type:
        - string
        - 'null'
    required:
    - item
    - quantity
  StockPatch:
    type: object
    properties:
      condition:
        type: string
        enum:
        - new
        - used
        - damaged
      storage_id:
        type:
        - string
        - 'null'
      lot_id:
        type:
        - string
        - 'null'
      purchase_location_id:
        type:
        - string
        - 'null'
      purchase_date:
        type:
        - string
        - 'null'
        description: ISO-8601 date or date-time, as stored.
      purchase_price:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      purchase_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      note:
        type:
        - string
        - 'null'
  LooseFigurePart:
    type: object
    properties:
      stock_id:
        type: string
      item:
        $ref: '#/components/schemas/Item'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      spare:
        type:
        - integer
        - 'null'
      quantity:
        type:
        - integer
        - 'null'
      missing:
        type:
        - integer
        - 'null'
      damaged:
        type:
        - integer
        - 'null'
      checked:
        type:
        - boolean
        - 'null'
  LooseFigurePartPatch:
    type: object
    properties:
      parts:
        type: array
        items:
          $ref: '#/components/schemas/LooseFigurePartKey'
        minItems: 1
        maxItems: 500
    required:
    - parts
    additionalProperties: false
  LooseFigurePartKey:
    type: object
    properties:
      item:
        allOf:
        - $ref: '#/components/schemas/ItemKey'
        description: The item, by number (decision 3) or by id.
      color:
        type:
        - integer
        - 'null'
        description: 'A colour in the provider space of the item key (decision 4):
          a BrickLink colour id with provider bricklink, a Rebrickable colour id with
          rebrickable, a Brick Work colour id when the item is named by id.'
      spare:
        type:
        - integer
        - 'null'
        description: Exact stored spare key; null and zero are distinct.
      missing:
        type: integer
        minimum: 0
      damaged:
        type: integer
        minimum: 0
      checked:
        type: boolean
    required:
    - item
    - color
    - spare
    additionalProperties: false
  MinifigureRow:
    type: object
    properties:
      item:
        $ref: '#/components/schemas/Item'
      name:
        type:
        - string
        - 'null'
      theme:
        type:
        - string
        - 'null'
      year:
        type:
        - integer
        - 'null'
      quantity:
        type: integer
      in_sets:
        type: integer
      missing:
        type: integer
      damaged:
        type: integer
      image_id:
        type:
        - integer
        - 'null'
  InstructionFile:
    type: object
    properties:
      archived_at:
        type:
        - string
        - 'null'
      id:
        type: integer
      item:
        $ref: '#/components/schemas/Item'
      name:
        type:
        - string
        - 'null'
      label:
        type:
        - string
        - 'null'
      added_at:
        type:
        - string
        - 'null'
        format: date-time
      content_url:
        type:
        - string
        - 'null'
    required:
    - id
  InstructionUpload:
    type: object
    properties:
      item:
        allOf:
        - $ref: '#/components/schemas/ItemKey'
        description: The item, by number (decision 3) or by id.
      label:
        type: string
      file:
        type: string
    required:
    - item
    - label
    - file
    description: multipart/form-data; file is a PDF of at most 20 MB.
  InstructionPatch:
    type: object
    properties:
      label:
        type: string
    required:
    - label
  PriceObservation:
    type: object
    properties:
      id:
        type: integer
      item:
        $ref: '#/components/schemas/Item'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      condition:
        type:
        - string
        - 'null'
        enum:
        - new
        - used
        - null
      guide:
        type: string
        enum:
        - sold
        - stock
        - retail
        - manual
        - valuation
      slot:
        type:
        - string
        - 'null'
      region:
        type:
        - string
        - 'null'
      currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      price:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      qty:
        type:
        - integer
        - 'null'
      sold:
        type:
        - integer
        - 'null'
      min:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      max:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      source:
        type: string
      observed_at:
        type:
        - string
        - 'null'
        format: date-time
      error:
        type:
        - string
        - 'null'
    required:
    - id
  PriceCurrent:
    type: object
    properties:
      observation:
        $ref: '#/components/schemas/PriceObservation'
      age_days:
        type:
        - number
        - 'null'
      stale:
        type: boolean
  ItemPrices:
    type: object
    properties:
      current:
        type: array
        items:
          $ref: '#/components/schemas/PriceCurrent'
      records:
        type: array
        items:
          $ref: '#/components/schemas/PriceObservation'
  PriceCreate:
    type: object
    properties:
      condition:
        type: string
        enum:
        - new
        - used
      guide:
        type: string
        enum:
        - manual
        - valuation
      price:
        type: string
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      currency:
        type: string
        pattern: ^[A-Z]{3,8}$
      slot:
        type:
        - string
        - 'null'
      color:
        type:
        - integer
        - 'null'
        description: 'A colour in the provider space of the item key (decision 4):
          a BrickLink colour id with provider bricklink, a Rebrickable colour id with
          rebrickable, a Brick Work colour id when the item is named by id.'
      observed_at:
        type:
        - string
        - 'null'
        format: date-time
    required:
    - condition
    - guide
    - price
    - currency
    additionalProperties: false
  PriceBatch:
    type: object
    properties:
      items:
        type: array
        items:
          $ref: '#/components/schemas/PriceBatchItem'
        minItems: 1
        maxItems: 500
    required:
    - items
    additionalProperties: false
  PriceBatchItem:
    type: object
    properties:
      item:
        allOf:
        - $ref: '#/components/schemas/ItemKey'
        description: The item, by number (decision 3) or by id.
      color:
        type:
        - integer
        - 'null'
        description: 'A colour in the provider space of the item key (decision 4):
          a BrickLink colour id with provider bricklink, a Rebrickable colour id with
          rebrickable, a Brick Work colour id when the item is named by id.'
      condition:
        type: string
        enum:
        - new
        - used
      guide:
        type: string
        enum:
        - manual
        - valuation
      price:
        type: string
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      currency:
        type: string
        pattern: ^[A-Z]{3,8}$
      observed_at:
        type:
        - string
        - 'null'
        format: date-time
      slot:
        type:
        - string
        - 'null'
    required:
    - item
    - condition
    - guide
    - price
    - currency
    additionalProperties: false
  RefreshRequest:
    type: object
    properties: {}
    additionalProperties: false
    description: Queue the shared market_price step for the whole item; variant selection
      belongs to the pipeline. No network call before queueing.
  StaleItem:
    type: object
    properties:
      item:
        $ref: '#/components/schemas/Item'
      name:
        type:
        - string
        - 'null'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      condition:
        type:
        - string
        - 'null'
      source_table:
        description: Where the held or wanted line is, by table.
        type: string
        enum:
        - copy
        - stock
        - wish
  Wishlist:
    type: object
    properties:
      id:
        type: string
      name:
        type: string
      sort:
        type: integer
      count:
        type: integer
      note:
        type:
        - string
        - 'null'
      archived_at:
        type:
        - string
        - 'null'
      created_at:
        type:
        - string
        - 'null'
      bricklink_id:
        type:
        - string
        - 'null'
  WishlistCreate:
    type: object
    properties:
      name:
        type: string
      sort:
        type: integer
      note:
        type:
        - string
        - 'null'
      bricklink_id:
        type:
        - string
        - 'null'
    required:
    - name
  WishlistPatch:
    type: object
    properties:
      name:
        type: string
      sort:
        type: integer
      note:
        type:
        - string
        - 'null'
      bricklink_id:
        type:
        - string
        - 'null'
    minProperties: 1
  WishlistTransfer:
    type: object
    required:
    - ids
    properties:
      ids:
        type: array
        minItems: 1
        maxItems: 500
        items:
          type: string
      copy:
        type: boolean
        default: false
  ListOfWishlist:
    properties:
      data:
        items:
          $ref: '#/components/schemas/Wishlist'
        type: array
      page:
        $ref: '#/components/schemas/PageInfo'
    required:
    - data
    - page
    type: object
  OneWishlist:
    properties:
      data:
        $ref: '#/components/schemas/Wishlist'
    required:
    - data
    type: object
  WrittenWishlist:
    properties:
      data:
        $ref: '#/components/schemas/Wishlist'
      event_id:
        type: integer
      idempotent_replay:
        type: boolean
      undo_url:
        type: string
    required:
    - data
    - event_id
    type: object
  Wish:
    type: object
    properties:
      qty_filled:
        type: integer
        description: 'How many of the wished quantity you have (#35): qty_filled_manual
          when set, else derived from owned stock.'
      qty_filled_source:
        type: string
        enum:
        - derived
        - manual
      qty_filled_manual:
        type:
        - integer
        - 'null'
      list_id:
        type: string
        description: Target wishlist id; defaults to default on create.
      id:
        type: string
        description: uuid (Q6).
      item:
        $ref: '#/components/schemas/Item'
      name:
        type:
        - string
        - 'null'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      quantity:
        type: integer
      max_price:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      max_price_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      max_price_boxed:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float. The max for a quote with box (a
          set's slot boxed); without it such a quote is held against max_price.
      max_price_boxed_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      condition:
        type:
        - string
        - 'null'
        enum:
        - new
        - used
        - any
        - null
      note:
        type:
        - string
        - 'null'
      added_at:
        type:
        - string
        - 'null'
        format: date-time
      updated_at:
        type:
        - string
        - 'null'
        format: date-time
      archived_at:
        type:
        - string
        - 'null'
        format: date-time
      under_max:
        type:
        - boolean
        - 'null'
      under_max_boxed:
        type:
        - boolean
        - 'null'
        description: A set's current quote with box against max_price_boxed, or max_price
          when that is not set; null when either is missing or the currencies differ
          without a rate.
      current_price:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      flags:
        type: array
        items:
          type: string
      etag:
        type: string
      image_id:
        type:
        - integer
        - 'null'
    required:
    - id
    - item
    - quantity
  WishCreate:
    type: object
    properties:
      list_id:
        type: string
        description: Target wishlist id; defaults to default on create.
      item:
        allOf:
        - $ref: '#/components/schemas/ItemKey'
        description: The item, by number (decision 3) or by id.
      color:
        type:
        - integer
        - 'null'
        description: 'A colour in the provider space of the item key (decision 4):
          a BrickLink colour id with provider bricklink, a Rebrickable colour id with
          rebrickable, a Brick Work colour id when the item is named by id.'
      quantity:
        type: integer
      condition:
        type: string
        enum:
        - new
        - used
        - any
      note:
        type:
        - string
        - 'null'
      max_price:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      max_price_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      max_price_boxed:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float. The max for a quote with box (a
          set's slot boxed); without it such a quote is held against max_price.
      max_price_boxed_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      decision:
        type: string
        enum:
        - another
        - skip
    required:
    - item
  WishPatch:
    type: object
    properties:
      qty_filled_manual:
        type:
        - integer
        - 'null'
        description: Override the filled quantity; null goes back to the derived count.
      list_id:
        type: string
        description: Target wishlist id; defaults to default on create.
      quantity:
        type: integer
      color:
        type:
        - integer
        - 'null'
        description: 'A colour in the provider space of the item key (decision 4):
          a BrickLink colour id with provider bricklink, a Rebrickable colour id with
          rebrickable, a Brick Work colour id when the item is named by id.'
      condition:
        type: string
        enum:
        - new
        - used
        - any
      max_price:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      max_price_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      max_price_boxed:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float. The max for a quote with box (a
          set's slot boxed); without it such a quote is held against max_price.
      max_price_boxed_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      note:
        type:
        - string
        - 'null'
  WishToOwned:
    type: object
    properties:
      quantity:
        type: integer
      condition:
        type: string
        enum:
        - new
        - used
      completeness:
        type: string
        enum:
        - sealed
        - complete
        - incomplete
  Storage:
    type: object
    properties:
      id:
        description: The storage id. The virtual location "Not stored" has the id
          `unstored` (in a filter, `null` means not stored).
        type:
        - string
        - 'null'
      name:
        type:
        - string
        - 'null'
      copies:
        type: integer
      entries:
        type: integer
      pieces:
        type: integer
      lots:
        type: integer
      figures:
        type: integer
      part_lots:
        type: integer
      type:
        type:
        - string
        - 'null'
        enum:
        - Box
        - Shelf
        - Drawer
        - Bin
        - Bag
        - Case
        - Cabinet
        - Room
        - Other
        - null
      parent_id:
        type:
        - string
        - 'null'
      parent_name:
        type:
        - string
        - 'null'
      note:
        type:
        - string
        - 'null'
      archived_at:
        type:
        - string
        - 'null'
        format: date-time
    required:
    - id
  StorageDetail:
    type: object
    properties:
      location:
        $ref: '#/components/schemas/Storage'
      rows: {}
  StorageInput:
    type: object
    description: type, parent_id and note are optional; a field left out keeps its
      value. parent_id is another live storage, never this one or one inside it.
    properties:
      name:
        type: string
      type:
        type:
        - string
        - 'null'
        enum:
        - Box
        - Shelf
        - Drawer
        - Bin
        - Bag
        - Case
        - Cabinet
        - Room
        - Other
        - null
      parent_id:
        type:
        - string
        - 'null'
      note:
        type:
        - string
        - 'null'
    required:
    - name
  StorageMove:
    type: object
    properties:
      selections:
        type: array
        items:
          $ref: '#/components/schemas/StorageSelection'
    required:
    - selections
  StorageSelection:
    type: object
    properties:
      entity:
        type: string
        enum:
        - copy
        - stock
        - lot
      id:
        type: string
    required:
    - entity
    - id
  Lot:
    type: object
    properties:
      id:
        type: string
      name:
        type:
        - string
        - 'null'
      note:
        type:
        - string
        - 'null'
      created_at:
        type:
        - string
        - 'null'
        format: date-time
      storage_id:
        type:
        - string
        - 'null'
      purchase_location_id:
        type:
        - string
        - 'null'
      purchase_date:
        type:
        - string
        - 'null'
        description: ISO-8601 date or date-time, as stored.
      purchase_price:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      purchase_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      archived_at:
        type:
        - string
        - 'null'
        format: date-time
      entries:
        type: integer
      quantity:
        type: integer
    required:
    - id
  LotDetail:
    type: object
    properties:
      lot:
        $ref: '#/components/schemas/Lot'
      rows:
        type: array
        items:
          $ref: '#/components/schemas/Stock'
  LotCreate:
    type: object
    properties:
      stock_ids:
        type: array
        items:
          type: string
      name:
        type: string
      note:
        type:
        - string
        - 'null'
      storage_id:
        type:
        - string
        - 'null'
    required:
    - stock_ids
    - name
  LotPatch:
    type: object
    properties:
      name:
        type: string
      note:
        type:
        - string
        - 'null'
      storage_id:
        type:
        - string
        - 'null'
      purchase_location_id:
        type:
        - string
        - 'null'
      purchase_date:
        type:
        - string
        - 'null'
        description: ISO-8601 date or date-time, as stored.
      purchase_price:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      purchase_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
  Place:
    type: object
    properties:
      archived_at:
        type:
        - string
        - 'null'
      id:
        type: string
      name:
        type:
        - string
        - 'null'
      kind:
        type:
        - string
        - 'null'
      count:
        type: integer
      totals: {}
      orders:
        type: integer
        description: Orders whose store carries this name (derived).
      last_used:
        type:
        - string
        - 'null'
        description: Latest purchase or order date (derived).
    required:
    - id
  Flag:
    type: object
    properties:
      archived_at:
        type:
        - string
        - 'null'
      id:
        type: string
      name:
        type:
        - string
        - 'null'
      kind:
        type: string
        enum:
        - status
        - tag
        - owner
      shown_on_grid:
        type: boolean
      count:
        type: integer
    required:
    - id
  FlagInput:
    type: object
    properties:
      name:
        type: string
      kind:
        type: string
        enum:
        - status
        - tag
        - owner
    required:
    - name
    - kind
  NameInput:
    type: object
    properties:
      name:
        type: string
    required:
    - name
  Deleted:
    type: object
    properties:
      id:
        type:
        - string
        - integer
      archived:
        type: boolean
  Ranking:
    type: object
    properties:
      rows: {}
      settings: {}
  OrderDocument:
    type: object
    additionalProperties: false
    properties:
      id:
        type: integer
      order_id:
        type: integer
      source:
        type: string
        enum:
        - email
        - xml
        - api
      label:
        type:
        - string
        - 'null'
      phase:
        type: string
        enum:
        - draft
        - reviewed
        - saved
        - undone
      created_at:
        type: string
      updated_at:
        type: string
  OrderLine:
    type: object
    additionalProperties: false
    properties:
      id:
        type: integer
      order_id:
        type: integer
      document_id:
        type: integer
      document_phase:
        type: string
        enum:
        - draft
        - reviewed
        - saved
        - undone
      line_no:
        type: integer
      state:
        type: string
        enum:
        - matched
        - by_hand
        - confirmed
        - held
      item:
        oneOf:
        - $ref: '#/components/schemas/Item'
        - type: 'null'
        description: The item the line stands for; null while the importer could not
          place it (see raw and suggestions).
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      unplaced:
        type: boolean
      unplaced_reason:
        type:
        - string
        - 'null'
        description: Why the importer did not place the line, in words ("The BrickLink
          number is not in the catalogue", "The name matches several items"); null
          when it is placed, and on a line imported before schema 4.2.
      condition:
        type:
        - string
        - 'null'
        enum:
        - new
        - used
        - null
      qty:
        type: integer
      unit_price:
        type:
        - string
        - 'null'
      line_total:
        type:
        - string
        - 'null'
      remark:
        type:
        - string
        - 'null'
      raw:
        type: object
        additionalProperties: false
        description: The provider's own words, verbatim.
        properties:
          item_type:
            type:
            - string
            - 'null'
          item_no:
            type:
            - string
            - 'null'
          color_id:
            type:
            - integer
            - 'null'
          color_name:
            type:
            - string
            - 'null'
          name:
            type:
            - string
            - 'null'
          text:
            type:
            - string
            - 'null'
      received:
        type: integer
      allocated:
        type: integer
      paired_line_id:
        type:
        - integer
        - 'null'
      suggestions:
        type: array
        description: The items an unplaced line could be, for the person to choose
          from, best first. A line that names several items lists them; a line whose
          name no item has exactly lists the nearest names of the BrickLink item list
          (when loaded), the longest name that starts it first, then the names that
          hold all its words (#155). Never placed by itself.
        items:
          type: object
          additionalProperties: false
          properties:
            item:
              $ref: '#/components/schemas/Item'
            label:
              type: string
  OrderDestination:
    type: object
    additionalProperties: false
    properties:
      copy_id:
        type: string
      target:
        type: string
        enum:
        - part
        - figure
        - instructions
        - box
        - stock-part
      target_id:
        type:
        - integer
        - string
      need:
        type: integer
      item:
        $ref: '#/components/schemas/Item'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      label:
        type:
        - string
        - 'null'
  Order:
    type: object
    additionalProperties: false
    required:
    - id
    properties:
      id:
        type: integer
      bricklink_order_id:
        type:
        - string
        - 'null'
      store:
        type:
        - string
        - 'null'
      seller:
        type:
        - string
        - 'null'
      date_ordered:
        type:
        - string
        - 'null'
        description: ISO-8601 date or date-time, as stored.
      status:
        type:
        - string
        - 'null'
      cost:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      phase:
        type: string
        enum:
        - Draft
        - Reviewed
        - Held
        - Reconciled
        - Allocated
        - Counting
        - Open
        description: Where the order stands, as the Orders page says it.
      lines:
        type: integer
        description: Saved lines (lots)
        not counting a line paired to an earlier one.: null
      pieces:
        type: integer
      received:
        type: integer
      allocated:
        type: integer
      held:
        type: integer
        description: Saved lines on hold.
  OrderDetail:
    type: object
    additionalProperties: false
    properties:
      order:
        $ref: '#/components/schemas/Order'
      documents:
        type: array
        items:
          $ref: '#/components/schemas/OrderDocument'
      lines:
        type: array
        items:
          $ref: '#/components/schemas/OrderLine'
  OrderReview:
    type: object
    additionalProperties: false
    properties:
      id:
        type: integer
        description: The saved line.
      line:
        $ref: '#/components/schemas/OrderLine'
      available:
        type: integer
        description: Received and not yet allocated.
      destinations:
        type: array
        items:
          $ref: '#/components/schemas/OrderDestination'
  ListOfOrderReview:
    type: object
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/OrderReview'
      page:
        $ref: '#/components/schemas/PageInfo'
  Allocation:
    type: object
    additionalProperties: false
    required:
    - id
    - order_id
    - line_id
    - qty
    - target_type
    - state
    properties:
      id:
        type: integer
      confirm_id:
        type: string
      order_id:
        type: integer
      line_id:
        type: integer
      qty:
        type: integer
      state:
        type: string
        enum:
        - applied
        - pending
        - conflict
        - undoing
        - undone
      target_type:
        type: string
        enum:
        - copy
        - stock
      kind:
        type: string
        enum:
        - missing_part
        - missing_figure
        - instructions
        - box
        - loose_part
        - loose_figure
        - loose_other
      copy_id:
        type:
        - string
        - 'null'
      copy_part_id:
        type:
        - integer
        - 'null'
      copy_figure_id:
        type:
        - integer
        - 'null'
      stock_id:
        type:
        - string
        - 'null'
      item:
        $ref: '#/components/schemas/Item'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      intent_before:
        type:
        - integer
        - 'null'
      intent_after:
        type:
        - integer
        - 'null'
      created_at:
        type:
        - string
        - 'null'
      applied_at:
        type:
        - string
        - 'null'
      undone_at:
        type:
        - string
        - 'null'
      target_label:
        type:
        - string
        - 'null'
      undo_event_id:
        type:
        - integer
        - 'null'
        description: The save that undoes this allocation
        while it is the allocation's own.: null
  ListOfAllocation:
    type: object
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Allocation'
      page:
        $ref: '#/components/schemas/PageInfo'
  OrderHistory:
    type: object
    additionalProperties: false
    properties:
      id:
        type: integer
      receipt:
        type: object
        additionalProperties: true
      undone:
        type: boolean
      undo_available:
        type: boolean
      at:
        type: string
      via:
        type: string
      actor:
        type:
        - string
        - 'null'
  ListOfOrderHistory:
    type: object
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/OrderHistory'
      page:
        $ref: '#/components/schemas/PageInfo'
  OrderImport:
    type: object
    properties:
      source:
        type: string
        enum:
        - email
        - xml
        - api
      text:
        type: string
      number:
        type: string
      choice:
        type: string
      label:
        type: string
    required:
    - source
  OrderImportResult:
    type: object
    additionalProperties: false
    properties:
      order_id:
        type: integer
      document_id:
        type: integer
      duplicate:
        type: boolean
        description: The same document is already there; nothing was written.
      placed:
        type: integer
        description: Lines placed on an item.
      unplaced:
        type: integer
        description: Lines that wait for hand matching.
      event_id:
        type:
        - integer
        - 'null'
  OrderLineMatch:
    type: object
    properties:
      item:
        allOf:
        - $ref: '#/components/schemas/ItemKey'
        description: The item, by number (decision 3) or by id.
      color:
        type:
        - integer
        - 'null'
        description: 'A colour in the provider space of the item key (decision 4):
          a BrickLink colour id with provider bricklink, a Rebrickable colour id with
          rebrickable, a Brick Work colour id when the item is named by id.'
    required:
    - item
  Hold:
    type: object
    properties:
      held:
        type: boolean
    required:
    - held
  OrderPhase:
    type: object
    properties:
      action:
        type: string
        enum:
        - review
        - reopen
        - save
      pairs:
        type: object
        minProperties: 1
        propertyNames:
          pattern: '[0-9]{1,12}'
        additionalProperties:
          type: integer
          minimum: 1
    required:
    - action
    additionalProperties: false
  OrderReceived:
    type: object
    properties:
      counts:
        type: object
        minProperties: 1
        propertyNames:
          pattern: '[0-9]{1,12}'
        additionalProperties:
          type: integer
          minimum: 0
    required:
    - counts
    additionalProperties: false
  OrderAllocate:
    type: object
    properties:
      chosen:
        type: array
        minItems: 1
        maxItems: 1000
        items:
          type: object
          required:
          - line_id
          - target_type
          - quantity
          properties:
            line_id:
              type: integer
              minimum: 1
            target_type:
              enum:
              - copy
              - stock
            quantity:
              type: integer
              minimum: 1
            copy_id:
              type: string
            target:
              enum:
              - part
              - figure
              - instructions
              - box
            target_id:
              type:
              - integer
              - string
            storage_id:
              type:
              - string
              - 'null'
            lot_id:
              type:
              - string
              - 'null'
          additionalProperties: false
          allOf:
          - if:
              properties:
                target_type:
                  const: copy
            then:
              required:
              - copy_id
              - target
              - target_id
    required:
    - chosen
    additionalProperties: false
  Event:
    type: object
    properties:
      actor:
        type:
        - string
        - 'null'
      id:
        type: integer
      entity:
        type: string
      field:
        type: string
      old_value: {}
      new_value: {}
      at:
        type: string
        format: date-time
      via:
        type: string
        enum:
        - app
        - cli
        - api
        - import
        - migration
      undoable:
        type: boolean
      undone:
        type: boolean
    required:
    - id
    - entity
    - field
    - at
    - via
  UndoResult:
    type: object
    properties:
      undone_event_id:
        type: integer
      event_id:
        type:
        - integer
        - 'null'
      already_undone:
        type: boolean
  Job:
    type: object
    properties:
      id:
        type: integer
      source:
        type: string
      kind:
        type: string
      item:
        oneOf:
        - $ref: '#/components/schemas/Item'
        - type: 'null'
      state:
        type: string
        enum:
        - queued
        - running
        - waiting_for_budget
        - failed
        - done
      attempts:
        type: integer
      retry_at:
        type:
        - string
        - 'null'
        format: date-time
      error:
        type:
        - string
        - 'null'
      created_at:
        type: string
        format: date-time
      updated_at:
        type: string
        format: date-time
      steps:
        type: array
        items:
          $ref: '#/components/schemas/JobStep'
      interrupted:
        type: boolean
    required:
    - id
    - state
  JobStep:
    type: object
    properties:
      name:
        type: string
      position:
        type: integer
      state:
        type: string
      source:
        type:
        - string
        - 'null'
      error:
        type:
        - string
        - 'null'
      error_code:
        type:
        - string
        - 'null'
        description: 'Stable code of a failed step: source_not_configured, source_disabled
          or source_error.'
      retry_at:
        type:
        - string
        - 'null'
        format: date-time
  JobList:
    type: object
    properties:
      jobs:
        type: array
        items:
          $ref: '#/components/schemas/Job'
      skipped:
        type: array
        items:
          type: string
  JobRetry:
    type: object
    additionalProperties: false
    properties:
      step:
        type:
        - string
        - 'null'
  PictureRefresh:
    type: object
    additionalProperties: false
    properties:
      scope:
        type: string
        enum:
        - missing
        - all
        description: missing queues the held items that have a colour with no picture,
          all every held item.
      kinds:
        type: array
        minItems: 1
        items:
          $ref: '#/components/schemas/Kind'
        description: The item kinds to refresh; all kinds when left out.
      expected_count:
        type:
        - integer
        - 'null'
        description: The number of items the caller saw; the call is refused (422)
          when the count has changed.
    required:
    - scope
  Source:
    type: object
    properties:
      source:
        type: string
      name:
        type: string
      kind:
        type: string
        enum:
        - api
        - file
        - manual
      enabled:
        type: boolean
      key:
        $ref: '#/components/schemas/KeyState'
      budget:
        type:
        - integer
        - 'null'
      used_today:
        type: integer
      last_success:
        type:
        - string
        - 'null'
        format: date-time
      last_error: {}
    required:
    - source
    - enabled
    - key
  KeyState:
    type: object
    properties:
      configured:
        type: boolean
      origin:
        type:
        - string
        - 'null'
        enum:
        - env
        - stored
        - null
      saved_at:
        type:
        - string
        - 'null'
        format: date-time
    required:
    - configured
    description: Only configured, origin and saved_at. Environment keys win over encrypted
      stored keys. Key values and fragments are never returned, logged or shown. BW_SECRET_KEY
      is required for key entry.
    additionalProperties: false
  SourceToggle:
    type: object
    properties:
      enabled:
        type: boolean
    required:
    - enabled
  Statistics:
    type: object
    properties:
      completeness: {}
      theme: {}
      storage: {}
      purchase place: {}
  DatabaseCheck:
    type: object
    properties:
      integrity_check:
        type: array
        items:
          type: string
      catalogue_integrity_check:
        type: array
        items:
          type: string
        description: The attached catalogue file's own integrity check; absent without
          a catalogue.
      foreign_key_check: {}
      row_counts: {}
  Identification:
    type: object
    additionalProperties: false
    required:
    - id
    - created_at
    - has_thumb
    - candidates
    properties:
      id:
        type: string
      created_at:
        type:
        - string
        - 'null'
      has_thumb:
        type: boolean
      missing_count:
        type:
        - integer
        - 'null'
      archived_at:
        type:
        - string
        - 'null'
      candidates:
        type: array
        description: The items the photo may show, best first.
        items:
          type: object
          additionalProperties: false
          properties:
            item:
              oneOf:
              - $ref: '#/components/schemas/Item'
              - type: 'null'
            score:
              type:
              - number
              - 'null'
            name:
              type:
              - string
              - 'null'
            owned:
              type:
              - object
              - 'null'
              additionalProperties: true
              description: 'On the answer of the upload (#45): total held, colours
                with quantity and storages, needed_by, needed_count and a sentence.'
      unresolved:
        type: array
        description: On the answer of the upload only; predictions that name no item,
          several, or one still to check.
        items:
          type: object
          additionalProperties: false
          properties:
            kind:
              type: string
            number:
              type: string
            score:
              type:
              - number
              - 'null'
            reason:
              type: string
  OneHealth:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/Health'
  OneVersion:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/Version'
  OneMe:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/Me'
  ListOfCatalogueItem:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/CatalogueItem'
      page:
        $ref: '#/components/schemas/PageInfo'
  OneCatalogueItem:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/CatalogueItem'
  OneCatalogueStatus:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/CatalogueStatus'
  ListOfColor:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Color'
      page:
        $ref: '#/components/schemas/PageInfo'
  OneColor:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/Color'
  ListOfItem:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Item'
      page:
        $ref: '#/components/schemas/PageInfo'
  OneItemDetail:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/ItemDetail'
  ListOfInventoryLine:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/InventoryLine'
      page:
        $ref: '#/components/schemas/PageInfo'
  ListOfUsedIn:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/UsedIn'
      page:
        $ref: '#/components/schemas/PageInfo'
  ListOfImage:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Image'
      page:
        $ref: '#/components/schemas/PageInfo'
  OneJob:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/Job'
  ListOfCopy:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Copy'
      page:
        $ref: '#/components/schemas/PageInfo'
  Created:
    type: object
    properties:
      ids:
        type: array
        items:
          type:
          - string
          - integer
    required:
    - ids
    additionalProperties: false
  WrittenSkipped:
    type: object
    required:
    - data
    - event_id
    - idempotent_replay
    properties:
      data:
        $ref: '#/components/schemas/Skipped'
      event_id:
        type: 'null'
      undo_url:
        type: 'null'
      idempotent_replay:
        type: boolean
    additionalProperties: false
  Skipped:
    type: object
    required:
    - skipped
    - existing
    properties:
      skipped:
        type: boolean
        enum:
        - true
      existing:
        $ref: '#/components/schemas/Item'
        description: The item that is already owned or wished.
    additionalProperties: false
  WrittenCreated:
    type: object
    required:
    - data
    - event_id
    - undo_url
    - idempotent_replay
    properties:
      data:
        $ref: '#/components/schemas/Created'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
    additionalProperties: false
  WrittenCopy:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/Copy'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  OneCopy:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/Copy'
  OneCompleteness:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/Completeness'
  WrittenCompleteness:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/Completeness'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  OneCheckState:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/CheckState'
  WrittenCheckState:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/CheckState'
      event_id:
        type:
        - integer
        - 'null'
        description: The receipt of the answer; null when the call changed nothing
          (a start while the check is running).
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  ListOfGap:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Gap'
      page:
        $ref: '#/components/schemas/PageInfo'
  ListOfMatch:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Match'
      page:
        $ref: '#/components/schemas/PageInfo'
  WrittenReceipt:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/Receipt'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  ListOfCopyPart:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/CopyPart'
      page:
        $ref: '#/components/schemas/PageInfo'
  WrittenCopyPart:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/CopyPart'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  WrittenBulkResult:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/BulkResult'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  ListOfCopyFigure:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/CopyFigure'
      page:
        $ref: '#/components/schemas/PageInfo'
  WrittenCopyFigure:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/CopyFigure'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  ListOfStock:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Stock'
      page:
        $ref: '#/components/schemas/PageInfo'
  WrittenStock:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/Stock'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  OneStock:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/Stock'
  ListOfLooseFigurePart:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/LooseFigurePart'
      page:
        $ref: '#/components/schemas/PageInfo'
  WrittenLooseFigureParts:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/LooseFigureParts'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  ListOfMinifigureRow:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/MinifigureRow'
      page:
        $ref: '#/components/schemas/PageInfo'
  ListOfInstructionFile:
    description: The file records (archived ones with `archived=include|only`). `coverage`
      counts the booklet identities (instructions items) and how many of them have
      a PDF through the set with their number.
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/InstructionFile'
      page:
        $ref: '#/components/schemas/PageInfo'
      coverage:
        type: object
        properties:
          total:
            type: integer
          covered:
            type: integer
        required:
        - total
        - covered
  OneInstructionFile:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/InstructionFile'
  WrittenInstructionFile:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/InstructionFile'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  ListOfPriceCurrent:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/PriceCurrent'
      page:
        $ref: '#/components/schemas/PageInfo'
  OneItemPrices:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/ItemPrices'
  ListOfPriceObservation:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/PriceObservation'
      page:
        $ref: '#/components/schemas/PageInfo'
  WrittenPriceObservation:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/PriceObservation'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  ListOfStaleItem:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/StaleItem'
      page:
        $ref: '#/components/schemas/PageInfo'
  WrittenJobList:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/JobList'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  ListOfWish:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Wish'
      page:
        $ref: '#/components/schemas/PageInfo'
  WrittenWish:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/Wish'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  OneWish:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/Wish'
  ListOfStorage:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Storage'
      page:
        $ref: '#/components/schemas/PageInfo'
  WrittenStorage:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/Storage'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  OneStorageDetail:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/StorageDetail'
  ListOfLot:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Lot'
      page:
        $ref: '#/components/schemas/PageInfo'
  WrittenLot:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/Lot'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  OneLotDetail:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/LotDetail'
  ListOfPlace:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Place'
      page:
        $ref: '#/components/schemas/PageInfo'
  WrittenPlace:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/Place'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  WrittenDeleted:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/Deleted'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  ListOfFlag:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Flag'
      page:
        $ref: '#/components/schemas/PageInfo'
  WrittenFlag:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/Flag'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  OneRanking:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/Ranking'
  ListOfOrder:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Order'
      page:
        $ref: '#/components/schemas/PageInfo'
  OneOrderDetail:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/OrderDetail'
  WrittenOrderImportResult:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/OrderImportResult'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  ListOfEvent:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Event'
      page:
        $ref: '#/components/schemas/PageInfo'
  OneEvent:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/Event'
  WrittenUndoResult:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/UndoResult'
      event_id:
        type: integer
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  ListOfJob:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Job'
      page:
        $ref: '#/components/schemas/PageInfo'
  ListOfSource:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Source'
      page:
        $ref: '#/components/schemas/PageInfo'
  WrittenSource:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/Source'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  WrittenCatalogueStatus:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/CatalogueStatus'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  OneSettings:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/Settings'
  WrittenSettings:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/Settings'
      event_id:
        type:
        - integer
        - 'null'
        description: The event of the change; null when every value sent was the one
          already stored.
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  OneStatistics:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/Statistics'
  OneDatabaseCheck:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/DatabaseCheck'
  ListOfIdentification:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Identification'
      page:
        $ref: '#/components/schemas/PageInfo'
  ListOfToken:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/Token'
      page:
        $ref: '#/components/schemas/PageInfo'
  WrittenTokenCreated:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/TokenCreated'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  WrittenToken:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/Token'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  RankingPage:
    type: object
    required:
    - data
    - page
    - settings
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/RankingRow'
      page:
        $ref: '#/components/schemas/PageInfo'
      settings:
        $ref: '#/components/schemas/Settings'
  RankingRow:
    type: object
    properties:
      id:
        type: string
      group:
        type: string
      items: {}
      rank:
        type:
        - integer
        - 'null'
      reasons: {}
      missing_count:
        type: integer
      missing_figures:
        type: integer
      missing_parts:
        type: integer
      original_gap: {}
      stock_used: {}
      unresolved_items: {}
      display_ratio_width: {}
      complete_quote: {}
      listing: {}
      item:
        $ref: '#/components/schemas/Item'
      name:
        type:
        - string
        - 'null'
      condition:
        type:
        - string
        - 'null'
        enum:
        - new
        - used
        - null
      completeness:
        type:
        - string
        - 'null'
        enum:
        - sealed
        - complete
        - incomplete
        - null
      completeness_source:
        type:
        - string
        - 'null'
        enum:
        - manual
        - derived
        - null
      storage_id:
        type:
        - string
        - 'null'
      purchase_location_id:
        type:
        - string
        - 'null'
      purchase_date:
        type:
        - string
        - 'null'
        description: ISO-8601 date or date-time, as stored.
      purchase_price:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      purchase_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      note:
        type:
        - string
        - 'null'
      current_value:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      current_value_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      pinned:
        type: boolean
      missing:
        type: integer
      damaged:
        type: integer
      updated_at:
        type:
        - string
        - 'null'
        format: date-time
      archived_at:
        type:
        - string
        - 'null'
        format: date-time
      value_when_complete:
        type:
        - string
        - 'null'
      valuation_basis:
        type:
        - string
        - 'null'
      breakdown:
        type: object
        additionalProperties:
          type: string
      repair_cost:
        type:
        - string
        - 'null'
      gross_gain:
        type:
        - string
        - 'null'
      net_gain:
        type:
        - string
        - 'null'
      ratio:
        type:
        - string
        - 'null'
      ratio_width:
        type: number
      ratio_overflow:
        type: boolean
    required:
    - id
    - group
    - items
  WrittenJob:
    type: object
    additionalProperties: false
    required:
    - data
    - event_id
    - undo_url
    - idempotent_replay
    properties:
      data:
        $ref: '#/components/schemas/Job'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  SyncStatus:
    type: object
    additionalProperties: false
    properties:
      source:
        type: string
      label:
        type: string
      credentials:
        type: object
      link:
        type: object
      last_pull:
        type:
        - object
        - 'null'
      last_send:
        type:
        - object
        - 'null'
      waiting:
        type: integer
  SyncList:
    type: object
    additionalProperties: false
    properties:
      id:
        type: integer
      name:
        type: string
      sets:
        type:
        - integer
        - 'null'
  SyncPlan:
    type: object
    additionalProperties: false
    properties:
      id:
        type: string
      created_at:
        type: string
      direction:
        type: string
        enum:
        - pull
        - send
      source:
        type: string
      link:
        type: object
      rows:
        type: array
        items:
          type: object
      unmatched:
        type: array
        items:
          type: object
      summary:
        type: object
      note:
        type: string
      remote:
        type: object
        description: What the site holds, as read for this plan.
      state:
        type: object
        description: On a send plan, the baseline the plan was made against.
  SyncApplied:
    type: object
    additionalProperties: false
    properties:
      already_applied:
        type: boolean
      counts:
        type: object
      event_id:
        type:
        - integer
        - 'null'
  SyncSent:
    type: object
    additionalProperties: false
    properties:
      plan:
        type: string
      counts:
        type: object
      rows:
        type: array
        items:
          type: object
      note:
        type: string
  SyncCredentials:
    type: object
    additionalProperties: false
    properties:
      source:
        type: string
      user:
        type: object
      key:
        type: object
  OneSyncStatus:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/SyncStatus'
  SyncListPage:
    type: object
    required:
    - data
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/SyncList'
  WrittenSyncStatus:
    type: object
    additionalProperties: false
    required:
    - data
    - event_id
    - undo_url
    - idempotent_replay
    properties:
      data:
        $ref: '#/components/schemas/SyncStatus'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  WrittenSyncPlan:
    type: object
    additionalProperties: false
    required:
    - data
    - event_id
    - undo_url
    - idempotent_replay
    properties:
      data:
        $ref: '#/components/schemas/SyncPlan'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  WrittenSyncApplied:
    type: object
    additionalProperties: false
    required:
    - data
    - event_id
    - undo_url
    - idempotent_replay
    properties:
      data:
        $ref: '#/components/schemas/SyncApplied'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  WrittenSyncSent:
    type: object
    additionalProperties: false
    required:
    - data
    - event_id
    - undo_url
    - idempotent_replay
    properties:
      data:
        $ref: '#/components/schemas/SyncSent'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  WrittenSyncCredentials:
    type: object
    additionalProperties: false
    required:
    - data
    - event_id
    - undo_url
    - idempotent_replay
    properties:
      data:
        $ref: '#/components/schemas/SyncCredentials'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  ExchangeRate:
    type: object
    additionalProperties: false
    properties:
      currency:
        type: string
      per_eur:
        type: string
      as_of:
        type:
        - string
        - 'null'
      source:
        type: string
        enum:
        - manual
        - ecb
  EcbResult:
    type: object
    additionalProperties: false
    properties:
      as_of:
        type: string
      updated:
        type: integer
      kept_manual:
        type: integer
  WrittenExchangeRates:
    type: object
    additionalProperties: false
    required:
    - data
    - event_id
    - undo_url
    - idempotent_replay
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/ExchangeRate'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  WrittenEcbResult:
    type: object
    additionalProperties: false
    required:
    - data
    - event_id
    - undo_url
    - idempotent_replay
    properties:
      data:
        $ref: '#/components/schemas/EcbResult'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  WrittenKeyTest:
    type: object
    additionalProperties: false
    required:
    - data
    - event_id
    - undo_url
    - idempotent_replay
    properties:
      data:
        $ref: '#/components/schemas/KeyTest'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  ImportPlan:
    type: object
    additionalProperties: false
    properties:
      id:
        type: string
      created_at:
        type: string
      source:
        type: string
      schema:
        type: object
      fresh:
        type: boolean
      summary:
        type: object
      unplaced:
        type: array
        items:
          type: object
      rows:
        type: array
        items:
          type: object
  ImportApplied:
    type: object
    additionalProperties: false
    properties:
      already_applied:
        type: boolean
      counts:
        type: object
      event_id:
        type:
        - integer
        - 'null'
  WrittenImportPlan:
    type: object
    additionalProperties: false
    required:
    - data
    - event_id
    - undo_url
    - idempotent_replay
    properties:
      data:
        $ref: '#/components/schemas/ImportPlan'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  WrittenImportApplied:
    type: object
    additionalProperties: false
    required:
    - data
    - event_id
    - undo_url
    - idempotent_replay
    properties:
      data:
        $ref: '#/components/schemas/ImportApplied'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  WrittenIdentification:
    type: object
    additionalProperties: false
    required:
    - data
    - event_id
    - undo_url
    - idempotent_replay
    properties:
      data:
        $ref: '#/components/schemas/Identification'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  KeyTest:
    type: object
    additionalProperties: false
    required:
    - source
    - ok
    - checked_at
    properties:
      source:
        type: string
      ok:
        type: boolean
        const: true
      checked_at:
        type: string
        format: date-time
  SourceKeyInput:
    type: object
    additionalProperties: false
    description: Write-only. One `key` for Rebrickable and Brickset; consumer_key,
      consumer_secret, token_value and token_secret for BrickLink. Values are never
      returned, logged or shown again.
    properties:
      key:
        type: string
        writeOnly: true
        minLength: 8
        maxLength: 256
      consumer_key:
        type: string
        writeOnly: true
        minLength: 8
        maxLength: 256
      consumer_secret:
        type: string
        writeOnly: true
        minLength: 8
        maxLength: 256
      token_value:
        type: string
        writeOnly: true
        minLength: 8
        maxLength: 256
      token_secret:
        type: string
        writeOnly: true
        minLength: 8
        maxLength: 256
  OneIdentification:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/Identification'
  LooseFigureParts:
    type: object
    required:
    - parts
    properties:
      parts:
        type: array
        items:
          $ref: '#/components/schemas/LooseFigurePart'
    additionalProperties: false
  Copy:
    type: object
    properties:
      partout:
        type:
        - object
        - 'null'
        description: 'Part-out value on a single copy read (#38): used quotes for
          present parts and whole figures.'
        properties:
          value:
            type:
            - string
            - 'null'
          currency:
            type: string
          lines:
            type: integer
          priced:
            type: integer
          unpriced:
            description: Up to 50 lines without a usable quote.
            type: array
            items:
              type: object
              properties:
                item:
                  $ref: '#/components/schemas/Item'
                color:
                  oneOf:
                  - $ref: '#/components/schemas/Color'
                  - type: 'null'
          unpriced_count:
            type: integer
      id:
        type: string
      item:
        $ref: '#/components/schemas/Item'
      name:
        type:
        - string
        - 'null'
      condition:
        type:
        - string
        - 'null'
        enum:
        - new
        - used
        - null
      completeness:
        type:
        - string
        - 'null'
        enum:
        - sealed
        - complete
        - incomplete
        - null
      completeness_source:
        type:
        - string
        - 'null'
        enum:
        - manual
        - derived
        - null
      storage_id:
        type:
        - string
        - 'null'
      purchase_location_id:
        type:
        - string
        - 'null'
      purchase_date:
        type:
        - string
        - 'null'
        description: ISO-8601 date or date-time, as stored.
      purchase_price:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      purchase_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      note:
        type:
        - string
        - 'null'
      current_value:
        type:
        - string
        - 'null'
        pattern: ^[0-9]+(\.[0-9]+)?$
        description: Decimal string, never a float.
      current_value_currency:
        type:
        - string
        - 'null'
        pattern: ^[A-Z]{3,8}$
      pinned:
        type: boolean
      flags:
        type: array
        items:
          type: string
      missing:
        type: integer
      damaged:
        type: integer
      updated_at:
        type:
        - string
        - 'null'
        format: date-time
      archived_at:
        type:
        - string
        - 'null'
        format: date-time
      etag:
        type: string
      image_id:
        type:
        - integer
        - 'null'
      inventory:
        $ref: '#/components/schemas/CopyInventory'
    required:
    - id
    - item
  Settings:
    type: object
    properties:
      display_currency:
        type: string
        description: Totals and comparisons across currencies convert into this (#39).
      retail_country:
        type: string
        enum:
        - DE
        - US
        - UK
        - CA
      bricklink_region:
        type: string
      bricklink_currency:
        type: string
        pattern: ^[A-Z]{3,8}$
      incomplete_discount_pct:
        type: number
      source_priority:
        type: object
        description: 'Source order per step and item kind: `{step: {kind or "*": [source
          ids]}}`, the steps being `pictures` (design 6.8), `metadata` and `market_price`.
          A step that is sent replaces that step; a step that is left out keeps its
          order.'
        additionalProperties:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
      import_order: {}
      freshness: {}
      repair: {}
      prefer_bricklink_inventory:
        type: boolean
        description: New copies take BrickLink's part list when one exists (design
          4.4).
      candidate_sets_common_max:
        type: integer
        minimum: 25
        description: Lot Detective ignores, by default, the parts that more than this
          many sets hold (default 300;
  SettingsPatch:
    type: object
    properties:
      display_currency:
        type: string
        description: Totals and comparisons across currencies convert into this (#39).
      retail_country:
        type: string
        enum:
        - DE
        - US
        - UK
        - CA
      bricklink_region:
        type: string
      bricklink_currency:
        type: string
        pattern: ^[A-Z]{3,8}$
      incomplete_discount_pct:
        type: number
      source_priority:
        type: object
        description: 'Source order per step and item kind: `{step: {kind or "*": [source
          ids]}}`, the steps being `pictures` (design 6.8), `metadata` and `market_price`.
          A step that is sent replaces that step; a step that is left out keeps its
          order.'
        additionalProperties:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
      import_order: {}
      freshness: {}
      repair: {}
      prefer_bricklink_inventory:
        type: boolean
        description: New copies take BrickLink's part list when one exists (design
          4.4).
      candidate_sets_common_max:
        type: integer
        minimum: 25
        description: Lot Detective ignores, by default, the parts that more than this
          many sets hold (default 300;
  Problem:
    type: object
    properties:
      type:
        type: string
      title:
        type: string
      status:
        type: integer
      code:
        type: string
        enum:
        - bad_request
        - unknown_filter
        - unauthorized
        - forbidden
        - read_only_instance
        - not_found
        - method_not_allowed
        - api_retired
        - moved
        - archived
        - ambiguous
        - merged
        - conflict
        - stale_match
        - undo_blocked
        - not_undoable
        - idempotency_conflict
        - precondition_failed
        - payload_too_large
        - unsupported_media_type
        - validation_failed
        - unsupported_setting
        - unidentified
        - source_not_configured
        - source_disabled
        - catalogue_not_loaded
        - idempotency_key_required
        - budget_exhausted
        - source_throttled
        - too_many_attempts
        - source_error
        - not_set_up
        - api_disabled
        - db_unavailable
        - internal_error
        - not_implemented
      detail:
        type: string
      instance:
        type: string
      errors:
        type: array
        items:
          $ref: '#/components/schemas/FieldError'
      retry_after:
        type:
        - integer
        - 'null'
      job_id:
        type:
        - integer
        - 'null'
      source:
        type:
        - string
        - 'null'
      candidates:
        type: array
        items:
          $ref: '#/components/schemas/Item'
        description: 'With ambiguous: the items the number names.'
      survivor:
        type: integer
        description: 'With merged and moved: the live item''s id.'
      piece:
        type: string
        description: 'With not_implemented: the piece that brings the operation.'
      error:
        type: string
        description: 'With not_implemented: the same as code.'
    required:
    - type
    - title
    - status
    - code
    description: RFC 9457 problem+json. code is the stable machine key.
  Kind:
    type: string
    enum:
    - set
    - part
    - minifigure
    - instructions
    - box
    - gear
    - book
    - catalog
    description: What the item is (design 3.5); stored words are served (Q8).
  Color:
    type: object
    required:
    - id
    - name
    - rgb
    - bricklink_id
    - rebrickable_id
    properties:
      id:
        type: integer
        description: Brick Work colour id (per install).
      name:
        type: string
      rgb:
        type:
        - string
        - 'null'
        description: Six hex digits.
      bricklink_id:
        type:
        - integer
        - 'null'
      rebrickable_id:
        type:
        - integer
        - 'null'
  ItemBrickLink:
    type: object
    required:
    - type
    - 'no'
    - color_id
    - color_scoped
    - brickwork_color_id
    - preferred
    properties:
      type:
        type: string
        enum:
        - S
        - P
        - M
        - G
        - B
        - C
        - I
        - O
        description: BrickLink item type.
      'no':
        type: string
      color_id:
        type:
        - integer
        - 'null'
        description: The BrickLink colour id the link is scoped to. Null with color_scoped
          false holds for every colour (design 3.2); null with color_scoped true is
          a link scoped to a colour that has no BrickLink id (see brickwork_color_id),
          never "every colour".
      color_scoped:
        type: boolean
        description: True when the link holds for one colour only.
      brickwork_color_id:
        type:
        - integer
        - 'null'
        description: The Brick Work colour id the link is scoped to; null when color_scoped
          is false.
      preferred:
        type: boolean
  Item:
    type: object
    required:
    - id
    - kind
    - name
    - unidentified
    - bricklink
    - rebrickable
    properties:
      id:
        type: integer
        description: 'Brick Work id: per install, not stable across installs (design
          3.1).'
      kind:
        $ref: '#/components/schemas/Kind'
      name:
        type: string
      unidentified:
        type: boolean
        description: 'A local item that is not born at Rebrickable: no born key, or
          a BrickLink-only number (design 3.8). Replaces v1''s `?` type.'
      bricklink:
        type: array
        items:
          $ref: '#/components/schemas/ItemBrickLink'
        description: Confirmed BrickLink links, preferred first; colour-scoped rows
          list their colour.
      rebrickable:
        oneOf:
        - type: object
          required:
          - key
          properties:
            key:
              type: string
        - type: 'null'
      color:
        allOf:
        - $ref: '#/components/schemas/Color'
        description: 'Only on a by-number or lookup answer given a color: the resolved
          Brick Work colour.'
  ItemKey:
    type: object
    x-mcp-item: key
    description: 'Names an item in a request: by id, or by provider number (decision
      3: the default provider is bricklink). The colour next to it is in the same
      provider space.'
    properties:
      id:
        type: integer
      provider:
        type: string
        enum:
        - bricklink
        - rebrickable
        default: bricklink
      kind:
        $ref: '#/components/schemas/Kind'
      key:
        type: string
    oneOf:
    - required:
      - id
    - required:
      - kind
      - key
  CandidateSetPage:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/CandidateSets'
  CandidateSets:
    type: object
    required:
    - catalogue
    - lot
    - common_max
    - input
    - total
    - limit
    - offset
    - results
    properties:
      catalogue:
        type: object
        description: The index the answer came from.
        required:
        - sets
        - lines
        - postings
        - distinctive_max
        properties:
          sets:
            type: integer
          lines:
            type: integer
          postings:
            type: integer
          distinctive_max:
            type: integer
      lot:
        type: string
      common_max:
        type:
        - integer
        - 'null'
        description: N, the most sets a part may be held by and still count; null
          when `ignore_common` is false.
      input:
        type: object
        required:
        - lines
        - quantity
        - ignored_common_lines
        - unmatched_lines
        properties:
          lines:
            type: integer
            description: Lines scored (after the common parts were dropped).
          quantity:
            type: integer
          ignored_common_lines:
            type: integer
            description: Lines of the lot dropped because more than N sets hold them.
          unmatched_lines:
            type: integer
            description: Scored lines that no set holds.
      total:
        type: integer
        description: Candidate sets after the filters.
      limit:
        type: integer
      offset:
        type: integer
      results:
        type: array
        items:
          $ref: '#/components/schemas/CandidateSet'
  CandidateSet:
    type: object
    required:
    - rank
    - item
    - picture
    - score
    - evidence
    - coverage
    - reasons
    - covered_lines
    - set_lines
    - distinctive_found
    - distinctive_total
    - flags
    - swaps
    - distinctive_found_parts
    - distinctive_missing_parts
    properties:
      rank:
        type: integer
      item:
        $ref: '#/components/schemas/Item'
      picture:
        oneOf:
        - $ref: '#/components/schemas/CandidatePicture'
        - type: 'null'
      score:
        type: integer
        minimum: 0
        maximum: 100
        description: How strongly the found parts point to this set, 0 to 100, relative
          to the best candidate (evidence over the best candidate's evidence). Not
          a probability.
      evidence:
        type: number
        description: The engine's evidence in nats (ADR 0026).
      coverage:
        type: number
        description: Evidence over the set's total weight, 0 to 1.
      reasons:
        type: array
        items:
          type: string
      covered_quantity:
        type: integer
      set_quantity:
        type: integer
      covered_lines:
        type: integer
      complete_lines:
        type: integer
      set_lines:
        type: integer
      distinctive_found:
        type: integer
      distinctive_total:
        type: integer
      flags:
        type: object
        description: Per flag passed to the engine (`sticker`), what the lines carrying
          it contributed to this set.
        additionalProperties:
          type: object
          properties:
            lines:
              type: integer
            covered_quantity:
              type: integer
            evidence:
              type: number
      swaps:
        $ref: '#/components/schemas/SetScoreSwaps'
      distinctive_found_parts:
        type: array
        description: Up to 20 distinctive parts the lot has, heaviest first.
        items:
          $ref: '#/components/schemas/CandidatePart'
      distinctive_missing_parts:
        type: array
        description: Up to 20 distinctive parts of the set the lot does not have yet,
          heaviest first (`quantity` is 0).
        items:
          $ref: '#/components/schemas/CandidatePart'
  CandidatePicture:
    type: object
    required:
    - id
    - content_url
    - image_url
    properties:
      id:
        type:
        - integer
        - 'null'
        description: The newest local picture (`GET /images/{id}/content`).
      content_url:
        type:
        - string
        - 'null'
      image_url:
        type:
        - string
        - 'null'
        description: The catalogue's picture address for the item.
  CandidatePart:
    type: object
    required:
    - item
    - color
    - quantity
    - need
    - weight
    - only_in_set
    - printed
    - picture
    properties:
      item:
        $ref: '#/components/schemas/Item'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      quantity:
        type: integer
        description: How many of it the lot has.
      need:
        type: integer
        description: How many the set holds.
      weight:
        type: number
        description: The line's rarity weight ln(N/df).
      only_in_set:
        type: boolean
        description: Exactly one set holds this part in this colour.
      printed:
        type: boolean
        description: True only for a part that only this set holds and that is printed,
          that is a part number with a print suffix (`pr` and digits) or the printed
          child of a type P part relationship.
      picture:
        oneOf:
        - $ref: '#/components/schemas/CandidatePicture'
        - type: 'null'
  StickerCandidatePage:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/StickerCandidates'
  StickerCandidates:
    type: object
    required:
    - lot
    - stock_id
    - item
    - color
    - quantity
    - sticker
    - total
    - limit
    - offset
    - results
    properties:
      lot:
        type: string
      stock_id:
        type: string
      item:
        $ref: '#/components/schemas/Item'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      quantity:
        type: integer
      sticker:
        $ref: '#/components/schemas/StickerState'
      total:
        type: integer
      limit:
        type: integer
      offset:
        type: integer
      results:
        type: array
        items:
          $ref: '#/components/schemas/StickerCandidate'
  StickerState:
    type: object
    required:
    - flagged
    - confirmed
    properties:
      flagged:
        type: boolean
        description: The line holds the Sticker flag.
      confirmed:
        oneOf:
        - $ref: '#/components/schemas/StickerChoice'
        - type: 'null'
        description: The set chosen with "This one", only while the line holds the
          flag.
  StickerChoice:
    type: object
    required:
    - set_item_id
    - sheet_item_id
    properties:
      set_item_id:
        type: integer
      sheet_item_id:
        type: integer
      set_number:
        type:
        - string
        - 'null'
      set_name:
        type:
        - string
        - 'null'
  StickerCandidate:
    type: object
    required:
    - set
    - sheet
    - year
    - picture
    properties:
      set:
        $ref: '#/components/schemas/Item'
      sheet:
        $ref: '#/components/schemas/Item'
      year:
        type:
        - integer
        - 'null'
      picture:
        oneOf:
        - $ref: '#/components/schemas/CandidatePicture'
        - type: 'null'
        description: The sticker sheet's picture.
  PullListPage:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/PullList'
  PullList:
    type: object
    required:
    - lot
    - set
    - totals
    - nested
    - refusal
    - show
    - total
    - limit
    - offset
    - lines
    properties:
      lot:
        type: object
        required:
        - id
        - name
        properties:
          id:
            type: string
          name:
            type: string
      set:
        $ref: '#/components/schemas/Item'
      totals:
        $ref: '#/components/schemas/PullTotals'
      nested:
        type: boolean
        description: The set is made of other sets; Make it a copy does not handle
          those yet.
      refusal:
        type:
        - string
        - 'null'
        description: Why Make it a copy would be refused now, or null.
      show:
        type: string
      total:
        type: integer
        description: How many lines `show` keeps.
      limit:
        type: integer
      offset:
        type: integer
      lines:
        type: array
        items:
          $ref: '#/components/schemas/PullLine'
  PullTotals:
    type: object
    required:
    - need
    - held
    - found
    - to_find
    - lines
    - lines_to_find
    - figures_need
    - figures_found
    - lot_pieces
    - moves
    properties:
      need:
        type: integer
        description: Pieces the set has (parts and whole figures).
      held:
        type: integer
        description: Of them, what the lot can give already.
      found:
        type: integer
        description: '`held` plus the pieces ticked in the bulk.'
      to_find:
        type: integer
      lines:
        type: integer
      lines_to_find:
        type: integer
      figures_need:
        type: integer
      figures_found:
        type: integer
      lot_pieces:
        type: integer
        description: Every piece the lot holds, damaged ones included.
      moves:
        type: object
        required:
        - moves
        - missing
        - stays
        properties:
          moves:
            type: integer
            description: Found pieces that would move out of the lot.
          missing:
            type: integer
            description: Pieces recorded as missing on the copy.
          stays:
            type: integer
            description: Pieces the lot would keep (the pieces ticked in the bulk
              are counted in, then moved).
  PullLine:
    type: object
    required:
    - item
    - color
    - kind
    - category
    - need
    - held
    - found
    - to_find
    - picture
    properties:
      item:
        $ref: '#/components/schemas/Item'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      kind:
        type: string
        enum:
        - part
        - figure
      category:
        type: string
        description: The part's catalogue category (Minifigures for a whole figure).
      need:
        type: integer
      held:
        type: integer
      found:
        type: integer
      to_find:
        type: integer
      picture:
        oneOf:
        - $ref: '#/components/schemas/CandidatePicture'
        - type: 'null'
  PullFound:
    type: object
    description: One line of the pull list and how many of it are found.
    properties:
      item:
        allOf:
        - $ref: '#/components/schemas/ItemKey'
        description: The part or whole minifigure, by number (decision 3) or by id.
      color:
        type:
        - integer
        - 'null'
        description: A colour in the provider space of the item key (decision 4);
          a whole minifigure has none.
      found:
        type: integer
        minimum: 0
        description: The count found so far, what the lot already holds included.
    required:
    - item
    - found
  PullFoundWritten:
    type: object
    required:
    - line
    - totals
    properties:
      line:
        $ref: '#/components/schemas/PullLine'
      totals:
        $ref: '#/components/schemas/PullTotals'
  WrittenPullFound:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/PullFoundWritten'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  CopyFromLot:
    type: object
    required:
    - copy_id
    - set
    - pieces
    - figures
    - missing_parts
    - missing_figures
    - completeness
    - stays
    properties:
      copy_id:
        type: string
      set:
        $ref: '#/components/schemas/Item'
      pieces:
        type: integer
        description: Parts that moved into the copy.
      figures:
        type: integer
        description: Whole figures that moved into the copy.
      missing_parts:
        type: integer
      missing_figures:
        type: integer
      completeness:
        type: string
        enum:
        - complete
        - incomplete
      stays:
        type: integer
        description: Pieces the lot holds now.
  WrittenCopyFromLot:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/CopyFromLot'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  StickerConfirm:
    type: object
    required:
    - set_item_id
    - sheet_item_id
    properties:
      set_item_id:
        type: integer
        minimum: 1
        description: The set (an item id from the candidates).
      sheet_item_id:
        type: integer
        minimum: 1
        description: Its sticker sheet (an item id from the candidates).
  StickerWritten:
    type: object
    required:
    - changed
    - sticker
    properties:
      changed:
        type: boolean
        description: False when the write was already true and wrote nothing.
      sticker:
        $ref: '#/components/schemas/StickerState'
  WrittenSticker:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/StickerWritten'
      event_id:
        type:
        - integer
        - 'null'
      undo_url:
        type:
        - string
        - 'null'
      idempotent_replay:
        type: boolean
  SetScorePage:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/SetScores'
  SetScores:
    type: object
    required:
    - catalogue
    - source
    - input
    - total
    - limit
    - offset
    - results
    properties:
      catalogue:
        type: object
        description: The index the answer came from.
        required:
        - sets
        - lines
        - postings
        - distinctive_max
        properties:
          sets:
            type: integer
            description: N, the candidate sets (live sets with a latest inventory
              that has at least one line).
          lines:
            type: integer
            description: Distinct (part, colour) lines and whole figures held by those
              sets.
          postings:
            type: integer
          distinctive_max:
            type: integer
            description: A line held by at most this many candidate sets is distinctive.
      source:
        type: object
        required:
        - kind
        - id
        properties:
          kind:
            type: string
            enum:
            - lot
            - storage
            - loose
            - stock
          id:
            type:
            - string
            - 'null'
      input:
        type: object
        required:
        - lines
        - quantity
        - matched_lines
        - unmatched_lines
        - unmatched
        properties:
          lines:
            type: integer
          quantity:
            type: integer
          matched_lines:
            type: integer
            description: Lines of the pile that at least one set holds.
          unmatched_lines:
            type: integer
          unmatched:
            type: array
            description: Up to 50 of the lines no set holds.
            items:
              $ref: '#/components/schemas/SetScoreLine'
      total:
        type: integer
        description: Sets that share at least one line with the pile.
      limit:
        type: integer
      offset:
        type: integer
      results:
        type: array
        items:
          $ref: '#/components/schemas/SetScore'
  SetScoreLine:
    type: object
    required:
    - item
    - color
    - quantity
    properties:
      item:
        $ref: '#/components/schemas/Item'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      quantity:
        type: integer
        description: How many of it the pile has.
      need:
        type: integer
        description: How many the set holds (a matched line only).
      covered:
        type: integer
        description: min(quantity, need) (a matched line only).
      weight:
        type: number
        description: The line's rarity weight ln(N/df) (a matched line only).
      flags:
        type: array
        items:
          type: string
  SetScore:
    type: object
    required:
    - rank
    - item
    - evidence
    - coverage
    - covered_quantity
    - set_quantity
    - covered_lines
    - complete_lines
    - set_lines
    - distinctive_found
    - distinctive_total
    - matched
    - flags
    - swaps
    properties:
      rank:
        type: integer
      item:
        $ref: '#/components/schemas/Item'
      evidence:
        type: number
      coverage:
        type: number
      covered_quantity:
        type: integer
      set_quantity:
        type: integer
      covered_lines:
        type: integer
      complete_lines:
        type: integer
        description: Lines the pile covers in full.
      set_lines:
        type: integer
      distinctive_found:
        type: integer
      distinctive_total:
        type: integer
      matched:
        type: array
        items:
          $ref: '#/components/schemas/SetScoreLine'
      flags:
        type: object
        description: Per stock flag name, what the lines carrying it contributed to
          this set.
        additionalProperties:
          type: object
          required:
          - lines
          - covered_quantity
          - evidence
          properties:
            lines:
              type: integer
            covered_quantity:
              type: integer
            evidence:
              type: number
      swaps:
        $ref: '#/components/schemas/SetScoreSwaps'
  SetScoreSwaps:
    type: object
    description: Listed apart, never in any number above.
    required:
    - lines
    - quantity
    - items
    properties:
      lines:
        type: integer
      quantity:
        type: integer
      items:
        type: array
        description: Up to 20, heaviest first.
        items:
          type: object
          required:
          - kind
          - have
          - wanted
          - quantity
          properties:
            kind:
              type: string
              enum:
              - colour
              - mould
            have:
              $ref: '#/components/schemas/SetScoreLine'
            wanted:
              $ref: '#/components/schemas/SetScoreLine'
            quantity:
              type: integer
  ItemLink:
    type: object
    required:
    - provider
    - type
    - 'no'
    - color_id
    - color_scoped
    - brickwork_color_id
    - status
    - preferred
    properties:
      provider:
        type: string
      type:
        type: string
      'no':
        type: string
      color_id:
        description: The BrickLink colour id the link is scoped to; null for every
          colour, or for a scope that has no BrickLink colour (see `color_scoped`).
        type:
        - integer
        - 'null'
      color_scoped:
        description: True when the link applies to one colour only.
        type: boolean
      brickwork_color_id:
        description: The scope in Brick Work's own colour space; set exactly when
          `color_scoped`.
        type:
        - integer
        - 'null'
      status:
        type: string
        enum:
        - matched
        - inferred
        - manual
        - to_check
      method:
        type: string
      origin:
        type: string
        enum:
        - shipped
        - local
        - rule
        - bricklink_list
        - api
        - user
        - migration
      preferred:
        type: boolean
      decided_at:
        type:
        - string
        - 'null'
        format: date-time
  ItemLinkWrite:
    type: object
    required:
    - type
    - 'no'
    additionalProperties: false
    properties:
      provider:
        type: string
        enum:
        - bricklink
        default: bricklink
      type:
        type: string
        enum:
        - S
        - P
        - M
        - G
        - B
        - C
        - I
        - O
      'no':
        type: string
      color_id:
        type:
        - integer
        - 'null'
        description: BrickLink colour id to scope the link to; null for every colour.
      preferred:
        type: boolean
        description: 'Make this the preferred link for its colour scope; the previous
          one stops being preferred. false means no change to the preference: a preference
          is replaced by marking another link preferred, never cleared to none (there
          is always a resolver order).'
  ItemProviderStatus:
    type: object
    required:
    - provider
    - status
    - reason
    properties:
      provider:
        type: string
      status:
        type: string
        enum:
        - unmatched
        - to_check
      reason:
        type: string
        enum:
        - no_match
        - no_candidate
        - kind_differs
        - migration
      evidence: {}
      checked_at:
        type: string
        format: date-time
  LinkRow:
    type: object
    required:
    - item
    properties:
      item:
        $ref: '#/components/schemas/Item'
      link:
        oneOf:
        - $ref: '#/components/schemas/ItemLink'
        - type: 'null'
      provider_status:
        oneOf:
        - $ref: '#/components/schemas/ItemProviderStatus'
        - type: 'null'
    description: Exactly one of link and provider_status is set.
  MergeRequest:
    type: object
    required:
    - survivor
    additionalProperties: false
    properties:
      survivor:
        $ref: '#/components/schemas/ItemKey'
  UnmergeRequest:
    type: object
    additionalProperties: false
    properties:
      merge_id:
        type: integer
        description: The merge to undo; default the latest of this item.
  Merge:
    type: object
    required:
    - merge_id
    - survivor
    - merged
    properties:
      merge_id:
        type: integer
      survivor:
        $ref: '#/components/schemas/Item'
      merged:
        $ref: '#/components/schemas/Item'
      receipt:
        description: What moved and how collisions were resolved (design 3.6).
  BuildScoutPage:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/BuildScout'
  BuildScout:
    type: object
    required:
    - catalogue
    - source
    - input
    - filters
    - sharing
    - total
    - limit
    - offset
    - results
    properties:
      catalogue:
        type: object
        description: The parts index the answer came from, and how many of its sets
          are made of other sets.
        required:
        - sets
        - lines
        - postings
        - distinctive_max
        - nested
        properties:
          sets:
            type: integer
          lines:
            type: integer
          postings:
            type: integer
          distinctive_max:
            type: integer
          nested:
            type: integer
      source:
        type: object
        required:
        - lots
        - storages
        - loose
        - damaged
        - text
        properties:
          lots:
            type: array
            items:
              type: string
          storages:
            type: array
            items:
              type: string
          loose:
            type: boolean
          damaged:
            type: boolean
          text:
            type: string
            description: "The selection in words, 'Loose stock \xB7 2 lots \xB7 3\
              \ storages'; 'All loose stock' when none is chosen."
      input:
        type: object
        description: What the chosen stock holds that can be given.
        required:
        - lines
        - pieces
        - figures
        properties:
          lines:
            type: integer
          pieces:
            type: integer
            description: Loose parts counted.
          figures:
            type: integer
            description: Whole loose figures counted.
      filters:
        type: object
        description: The filters the answer applied, null where none.
        additionalProperties: true
      sharing:
        type: integer
        description: Sets that share at least one part line with the stock, before
          the filters.
      total:
        type: integer
        description: Sets that pass the filters.
      limit:
        type: integer
      offset:
        type: integer
      results:
        type: array
        items:
          $ref: '#/components/schemas/BuildScoutSet'
  BuildScoutSet:
    type: object
    required:
    - rank
    - item
    - year
    - theme
    - parts_available
    - parts_total
    - percent
    - missing_parts
    - missing_lines
    - figures_available
    - figures_required
    - missing_figures
    - nested
    properties:
      rank:
        type: integer
      item:
        $ref: '#/components/schemas/Item'
      year:
        type:
        - integer
        - 'null'
      theme:
        type:
        - string
        - 'null'
      parts_available:
        type: integer
        description: The sum over the set's part lines of min(have, need).
      parts_total:
        type: integer
        description: Pieces of the set's own parts, spares and a minifigure's components
          left out, the parts of its sub-sets in.
      percent:
        type: number
        description: parts_available over parts_total, in percent to one decimal.
          Swaps are never in it.
      missing_parts:
        type: integer
        description: parts_total less parts_available, in pieces.
      missing_lines:
        type: integer
        description: Part lines the stock does not cover in full.
      figures_available:
        type: integer
        description: The sum over the set's whole-figure lines of min(have, need)
          (a loose whole figure counts).
      figures_required:
        type: integer
      missing_figures:
        type: integer
      nested:
        type: boolean
        description: true when the set is made of other sets; Build it does not handle
          those.
      gaps:
        type: array
        description: With `detail`, the biggest missing part lines.
        items:
          $ref: '#/components/schemas/BuildScoutGap'
      figure_gaps:
        type: array
        description: With `detail`, the whole figures that are missing.
        items:
          $ref: '#/components/schemas/BuildScoutGap'
      cost:
        type: object
        description: With `detail`, the missing parts and figures priced from the
          current prices.
        required:
        - amount
        - currency
        - priced_lines
        - unpriced_lines
        properties:
          amount:
            type:
            - string
            - 'null'
            description: The sum, two decimals; null when no missing line has a price.
          currency:
            type:
            - string
            - 'null'
          priced_lines:
            type: integer
          unpriced_lines:
            type: integer
      swaps:
        type: object
        description: With `detail`, listed apart and never in any number above (the
          engine's swaps, ADR 0026).
        required:
        - lines
        - quantity
        - items
        properties:
          lines:
            type: integer
          quantity:
            type: integer
          items:
            type: array
            items:
              type: object
              required:
              - kind
              - have
              - wanted
              - quantity
              properties:
                kind:
                  type: string
                  enum:
                  - colour
                  - mould
                have:
                  $ref: '#/components/schemas/SetScoreLine'
                wanted:
                  $ref: '#/components/schemas/SetScoreLine'
                quantity:
                  type: integer
  BuildScoutGap:
    type: object
    required:
    - item
    - color
    - need
    - have
    - missing
    properties:
      item:
        $ref: '#/components/schemas/Item'
      color:
        oneOf:
        - $ref: '#/components/schemas/Color'
        - type: 'null'
      need:
        type: integer
      have:
        type: integer
        description: min(stock, need).
      missing:
        type: integer
  BuildFromStockRequest:
    type: object
    additionalProperties: false
    properties:
      lots:
        type: array
        items:
          type: string
        maxItems: 500
        uniqueItems: true
      storages:
        type: array
        items:
          type: string
        maxItems: 500
        uniqueItems: true
      loose:
        type: boolean
      damaged:
        type: boolean
  BuildFromStock:
    type: object
    required:
    - copy_id
    - item
    - pieces
    - figures
    - missing_parts
    - missing_figures
    - completeness
    properties:
      copy_id:
        type: string
      item:
        $ref: '#/components/schemas/Item'
      pieces:
        type: integer
        description: Loose parts moved into the copy.
      figures:
        type: integer
        description: Whole loose figures moved into the copy.
      missing_parts:
        type: integer
        description: Pieces recorded as missing on the copy.
      missing_figures:
        type: integer
      completeness:
        type: string
        enum:
        - complete
        - incomplete
  ChangeVariantRequest:
    type: object
    required:
    - to
    additionalProperties: false
    properties:
      to:
        $ref: '#/components/schemas/ItemKey'
  VariantChange:
    type: object
    required:
    - from
    - to
    - number
    properties:
      from:
        $ref: '#/components/schemas/Item'
      to:
        $ref: '#/components/schemas/Item'
      number:
        type:
        - string
        - 'null'
        description: The BrickLink number that became the new item's preferred link;
          null when neither item had one to move.
      receipt:
        description: What moved, as `{event_id, counts}`.
  CopyInventory:
    type: object
    required:
    - source
    - version
    - ordinal
    - of
    - pending
    - changed_since_build
    properties:
      source:
        type: string
        enum:
        - rebrickable
        - bricklink
        - rebrickable_api
        - migrated
        - none
      version:
        type:
        - integer
        - 'null'
        description: The Rebrickable inventory version, when the source is rebrickable.
      ordinal:
        type:
        - integer
        - 'null'
        description: Which of the set's lists this is, 1-based, newest last.
      of:
        type: integer
        description: How many lists the set has.
      pending:
        type:
        - string
        - 'null'
        enum:
        - bricklink
        - null
        description: bricklink while a switch waits for its fetch job.
      changed_since_build:
        type: boolean
        description: The catalogue's list for this version changed in a later build.
  CopyInventorySwitch:
    type: object
    required:
    - source
    additionalProperties: false
    properties:
      source:
        type: string
        enum:
        - rebrickable
        - bricklink
      version:
        type: integer
        description: 'With rebrickable: the version; default the latest.'
      remember:
        type: boolean
        description: Also use this list for new copies of the set (the set's part-list
          preference), in the same event.
  CatalogueStatus:
    type: object
    required:
    - loaded
    properties:
      loaded:
        type: boolean
      items:
        type: integer
      builds:
        type: array
        items:
          type: object
          properties:
            id:
              type: integer
            built_at:
              type: string
              format: date-time
            dump_date:
              type:
              - string
              - 'null'
            mapping_version:
              type:
              - string
              - 'null'
            local_mapping_manifest: {}
            bricklink_list: {}
            activated:
              type: boolean
      coverage:
        type: object
        description: Item links per status.
        properties:
          matched:
            type: integer
          inferred:
            type: integer
          manual:
            type: integer
          to_check:
            type: integer
      last_reconcile:
        type:
        - object
        - 'null'
        properties:
          at:
            type: string
            format: date-time
          summary: {}
  OneItem:
    type: object
    required:
    - data
    properties:
      data:
        $ref: '#/components/schemas/Item'
  ListOfItemLink:
    type: object
    required:
    - data
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/ItemLink'
  ListOfItemProviderStatus:
    type: object
    required:
    - data
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/ItemProviderStatus'
  ListOfLinkRow:
    type: object
    required:
    - data
    - page
    properties:
      data:
        type: array
        items:
          $ref: '#/components/schemas/LinkRow'
      page:
        $ref: '#/components/schemas/PageInfo'
  WrittenItemLink:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/ItemLink'
      event_id:
        type:
        - integer
        - 'null'
        description: The event of the change; null when the link was there as asked
          (the call is idempotent per link).
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  WrittenBuild:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/BuildFromStock'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  WrittenVariantChange:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/VariantChange'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean
  WrittenMerge:
    type: object
    required:
    - data
    - event_id
    properties:
      data:
        $ref: '#/components/schemas/Merge'
      event_id:
        type: integer
      undo_url:
        type: string
      idempotent_replay:
        type: boolean