{
  "openapi": "3.1.0",
  "info": {
    "title": "Stockout API",
    "version": "1.0.0",
    "summary": "Read-only JSON access to your own Stockout inventory.",
    "description": "The Stockout public API, version 1. It is **read-only**: GET and HEAD are the only methods, and no endpoint creates, updates or deletes anything. Writing is a planned later phase.\n\nAuthenticate with an API key minted in the app under Settings > Developers > API Keys (Owners and Admins only). The key resolves to exactly one team and every query is scoped to it server-side; there is no parameter that names a team. A key is a password to the whole team's data - keep it on a server.\n\nLists are keyset-paginated: follow `next_cursor` while `has_more` is true. The cursor is opaque and must be passed back byte-for-byte. Any query parameter a collection does not accept is a 400, never a silent ignore.\n\nEvery GET below also accepts HEAD, which returns the same status and headers with no body. OPTIONS is a CORS preflight. Anything else is 405. New fields and new collections may be added without notice, so ignore what you do not recognise.\n\nFull reference: https://stockoutinventory.com/developers.html",
    "contact": {
      "name": "Stockout support",
      "url": "https://stockoutinventory.com/contact.html"
    },
    "termsOfService": "https://stockoutinventory.com/privacy.html"
  },
  "externalDocs": {
    "description": "Stockout API reference",
    "url": "https://stockoutinventory.com/developers.html"
  },
  "servers": [
    {
      "url": "https://puhxxxsdvurwavbmuhhd.supabase.co/functions/v1/api",
      "description": "Canonical base URL."
    },
    {
      "url": "https://puhxxxsdvurwavbmuhhd.functions.supabase.co/api",
      "description": "Alias on the shorter function hostname; identical behaviour."
    }
  ],
  "security": [
    {
      "ApiKeyAuth": []
    }
  ],
  "tags": [
    {
      "name": "Service",
      "description": "Discovery and account information."
    },
    {
      "name": "Items",
      "description": "Everything you stock, at one location. This is the collection most integrations start with."
    },
    {
      "name": "Locations",
      "description": "The places you stock things. Most other collections carry a location_id pointing here."
    },
    {
      "name": "Kits",
      "description": "Bundles built out of inventory items. Making or selling a kit moves the component items’ stock."
    },
    {
      "name": "Kit components",
      "description": "The recipe rows joining a kit to the items it consumes."
    },
    {
      "name": "Equipment",
      "description": "Reusable gear that gets checked out and back in rather than consumed."
    },
    {
      "name": "Equipment log",
      "description": "One row per check-out or check-in. Subtract the check-ins from the check-outs to get what is still out."
    },
    {
      "name": "Checklists",
      "description": "Reusable checklists your team runs and ticks off."
    },
    {
      "name": "Checklist log",
      "description": "One row per completed run of a checklist."
    },
    {
      "name": "Folders",
      "description": "Named collections that reference other records. A folder holds pointers, never copies."
    },
    {
      "name": "Folder items",
      "description": "The pointers inside a folder. Each row names a kind and an id in the matching collection."
    },
    {
      "name": "Suppliers",
      "description": "Your vendor directory. Suppliers are team-wide, not tied to a location."
    },
    {
      "name": "Supplier contacts",
      "description": "People at a supplier."
    },
    {
      "name": "Item ↔ supplier links",
      "description": "The join table saying which suppliers can provide which item."
    },
    {
      "name": "Customers",
      "description": "Who work orders are done for. Customers are team-wide, not tied to a location."
    },
    {
      "name": "Work orders",
      "description": "Jobs with materials, labour, equipment and checklists hanging off them."
    },
    {
      "name": "Work-order materials",
      "description": "Items and kits planned for or consumed by a job. Using or fulfilling materials moves real stock."
    },
    {
      "name": "Work-order equipment",
      "description": "Gear reserved for a job."
    },
    {
      "name": "Work-order checklists",
      "description": "Checklists attached to a job."
    },
    {
      "name": "Work-order labour",
      "description": "Time booked against a job. hours × rate is what job costing adds up."
    },
    {
      "name": "Work-order activity",
      "description": "The audit trail on a job."
    },
    {
      "name": "Label templates",
      "description": "Saved label designs. Templates are team-wide — they are shared across every location."
    },
    {
      "name": "Stock movements",
      "description": "The append-only ledger of every quantity change. Rows here are never edited and never deleted, which is why this is the one collection with no updated_at and no is_deleted."
    },
    {
      "name": "Item external references",
      "description": "Maps a Stockout item to the same product in a connected system."
    },
    {
      "name": "Integrations",
      "description": "Which external systems your team has connected. Credentials are never part of this collection: settings and sync_cursor are not exposed by the API at all."
    }
  ],
  "paths": {
    "/v1/items": {
      "get": {
        "tags": [
          "Items"
        ],
        "summary": "List items",
        "description": "Everything you stock, at one location. This is the collection most integrations start with. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listItems",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          },
          {
            "$ref": "#/components/parameters/f_sku"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ItemsList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Items"
        ],
        "summary": "List items (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headItems",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          },
          {
            "$ref": "#/components/parameters/f_sku"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/items/{id}": {
      "get": {
        "tags": [
          "Items"
        ],
        "summary": "Fetch one row from items",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getItemsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          },
          {
            "$ref": "#/components/parameters/f_sku"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ItemsSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Items"
        ],
        "summary": "Fetch one row from items (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headItemsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          },
          {
            "$ref": "#/components/parameters/f_sku"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/locations": {
      "get": {
        "tags": [
          "Locations"
        ],
        "summary": "List locations",
        "description": "The places you stock things. Most other collections carry a location_id pointing here. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listLocations",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LocationsList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Locations"
        ],
        "summary": "List locations (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headLocations",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/locations/{id}": {
      "get": {
        "tags": [
          "Locations"
        ],
        "summary": "Fetch one row from locations",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getLocationsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LocationsSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Locations"
        ],
        "summary": "Fetch one row from locations (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headLocationsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/kits": {
      "get": {
        "tags": [
          "Kits"
        ],
        "summary": "List kits",
        "description": "Bundles built out of inventory items. Making or selling a kit moves the component items’ stock. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listKits",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KitsList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Kits"
        ],
        "summary": "List kits (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headKits",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/kits/{id}": {
      "get": {
        "tags": [
          "Kits"
        ],
        "summary": "Fetch one row from kits",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getKitsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KitsSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Kits"
        ],
        "summary": "Fetch one row from kits (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headKitsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/kit-components": {
      "get": {
        "tags": [
          "Kit components"
        ],
        "summary": "List kit components",
        "description": "The recipe rows joining a kit to the items it consumes. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listKitComponents",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_kit_id"
          },
          {
            "$ref": "#/components/parameters/f_item_id"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KitComponentsList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Kit components"
        ],
        "summary": "List kit components (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headKitComponents",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_kit_id"
          },
          {
            "$ref": "#/components/parameters/f_item_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/kit-components/{id}": {
      "get": {
        "tags": [
          "Kit components"
        ],
        "summary": "Fetch one row from kit-components",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getKitComponentsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_kit_id"
          },
          {
            "$ref": "#/components/parameters/f_item_id"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KitComponentsSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Kit components"
        ],
        "summary": "Fetch one row from kit-components (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headKitComponentsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_kit_id"
          },
          {
            "$ref": "#/components/parameters/f_item_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/equipment": {
      "get": {
        "tags": [
          "Equipment"
        ],
        "summary": "List equipment",
        "description": "Reusable gear that gets checked out and back in rather than consumed. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listEquipment",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EquipmentList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Equipment"
        ],
        "summary": "List equipment (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headEquipment",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/equipment/{id}": {
      "get": {
        "tags": [
          "Equipment"
        ],
        "summary": "Fetch one row from equipment",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getEquipmentRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EquipmentSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Equipment"
        ],
        "summary": "Fetch one row from equipment (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headEquipmentRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/equipment-log": {
      "get": {
        "tags": [
          "Equipment log"
        ],
        "summary": "List equipment log",
        "description": "One row per check-out or check-in. Subtract the check-ins from the check-outs to get what is still out. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listEquipmentLog",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_equipment_id"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EquipmentLogList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Equipment log"
        ],
        "summary": "List equipment log (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headEquipmentLog",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_equipment_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/equipment-log/{id}": {
      "get": {
        "tags": [
          "Equipment log"
        ],
        "summary": "Fetch one row from equipment-log",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getEquipmentLogRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_equipment_id"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EquipmentLogSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Equipment log"
        ],
        "summary": "Fetch one row from equipment-log (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headEquipmentLogRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_equipment_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/checklists": {
      "get": {
        "tags": [
          "Checklists"
        ],
        "summary": "List checklists",
        "description": "Reusable checklists your team runs and ticks off. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listChecklists",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChecklistsList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Checklists"
        ],
        "summary": "List checklists (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headChecklists",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/checklists/{id}": {
      "get": {
        "tags": [
          "Checklists"
        ],
        "summary": "Fetch one row from checklists",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getChecklistsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChecklistsSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Checklists"
        ],
        "summary": "Fetch one row from checklists (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headChecklistsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/checklist-log": {
      "get": {
        "tags": [
          "Checklist log"
        ],
        "summary": "List checklist log",
        "description": "One row per completed run of a checklist. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listChecklistLog",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_checklist_id"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChecklistLogList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Checklist log"
        ],
        "summary": "List checklist log (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headChecklistLog",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_checklist_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/checklist-log/{id}": {
      "get": {
        "tags": [
          "Checklist log"
        ],
        "summary": "Fetch one row from checklist-log",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getChecklistLogRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_checklist_id"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChecklistLogSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Checklist log"
        ],
        "summary": "Fetch one row from checklist-log (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headChecklistLogRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_checklist_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/folders": {
      "get": {
        "tags": [
          "Folders"
        ],
        "summary": "List folders",
        "description": "Named collections that reference other records. A folder holds pointers, never copies. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listFolders",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FoldersList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Folders"
        ],
        "summary": "List folders (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headFolders",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/folders/{id}": {
      "get": {
        "tags": [
          "Folders"
        ],
        "summary": "Fetch one row from folders",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getFoldersRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FoldersSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Folders"
        ],
        "summary": "Fetch one row from folders (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headFoldersRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/folder-items": {
      "get": {
        "tags": [
          "Folder items"
        ],
        "summary": "List folder items",
        "description": "The pointers inside a folder. Each row names a kind and an id in the matching collection. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listFolderItems",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_folder_id"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FolderItemsList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Folder items"
        ],
        "summary": "List folder items (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headFolderItems",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_folder_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/folder-items/{id}": {
      "get": {
        "tags": [
          "Folder items"
        ],
        "summary": "Fetch one row from folder-items",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getFolderItemsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_folder_id"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FolderItemsSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Folder items"
        ],
        "summary": "Fetch one row from folder-items (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headFolderItemsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_folder_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/suppliers": {
      "get": {
        "tags": [
          "Suppliers"
        ],
        "summary": "List suppliers",
        "description": "Your vendor directory. Suppliers are team-wide, not tied to a location. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listSuppliers",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuppliersList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Suppliers"
        ],
        "summary": "List suppliers (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headSuppliers",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/suppliers/{id}": {
      "get": {
        "tags": [
          "Suppliers"
        ],
        "summary": "Fetch one row from suppliers",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getSuppliersRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuppliersSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Suppliers"
        ],
        "summary": "Fetch one row from suppliers (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headSuppliersRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/supplier-contacts": {
      "get": {
        "tags": [
          "Supplier contacts"
        ],
        "summary": "List supplier contacts",
        "description": "People at a supplier. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listSupplierContacts",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_supplier_id"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupplierContactsList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Supplier contacts"
        ],
        "summary": "List supplier contacts (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headSupplierContacts",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_supplier_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/supplier-contacts/{id}": {
      "get": {
        "tags": [
          "Supplier contacts"
        ],
        "summary": "Fetch one row from supplier-contacts",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getSupplierContactsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_supplier_id"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupplierContactsSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Supplier contacts"
        ],
        "summary": "Fetch one row from supplier-contacts (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headSupplierContactsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_supplier_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/item-suppliers": {
      "get": {
        "tags": [
          "Item ↔ supplier links"
        ],
        "summary": "List item ↔ supplier links",
        "description": "The join table saying which suppliers can provide which item. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listItemSuppliers",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_item_id"
          },
          {
            "$ref": "#/components/parameters/f_supplier_id"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ItemSuppliersList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Item ↔ supplier links"
        ],
        "summary": "List item ↔ supplier links (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headItemSuppliers",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_item_id"
          },
          {
            "$ref": "#/components/parameters/f_supplier_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/item-suppliers/{id}": {
      "get": {
        "tags": [
          "Item ↔ supplier links"
        ],
        "summary": "Fetch one row from item-suppliers",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getItemSuppliersRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_item_id"
          },
          {
            "$ref": "#/components/parameters/f_supplier_id"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ItemSuppliersSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Item ↔ supplier links"
        ],
        "summary": "Fetch one row from item-suppliers (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headItemSuppliersRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_item_id"
          },
          {
            "$ref": "#/components/parameters/f_supplier_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/customers": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "List customers",
        "description": "Who work orders are done for. Customers are team-wide, not tied to a location. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listCustomers",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomersList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Customers"
        ],
        "summary": "List customers (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headCustomers",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/customers/{id}": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "Fetch one row from customers",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getCustomersRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomersSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Customers"
        ],
        "summary": "Fetch one row from customers (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headCustomersRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/work-orders": {
      "get": {
        "tags": [
          "Work orders"
        ],
        "summary": "List work orders",
        "description": "Jobs with materials, labour, equipment and checklists hanging off them. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listWorkOrders",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          },
          {
            "$ref": "#/components/parameters/f_customer_id"
          },
          {
            "$ref": "#/components/parameters/f_status"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkOrdersList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Work orders"
        ],
        "summary": "List work orders (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headWorkOrders",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          },
          {
            "$ref": "#/components/parameters/f_customer_id"
          },
          {
            "$ref": "#/components/parameters/f_status"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/work-orders/{id}": {
      "get": {
        "tags": [
          "Work orders"
        ],
        "summary": "Fetch one row from work-orders",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getWorkOrdersRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          },
          {
            "$ref": "#/components/parameters/f_customer_id"
          },
          {
            "$ref": "#/components/parameters/f_status"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkOrdersSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Work orders"
        ],
        "summary": "Fetch one row from work-orders (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headWorkOrdersRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          },
          {
            "$ref": "#/components/parameters/f_customer_id"
          },
          {
            "$ref": "#/components/parameters/f_status"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/work-order-materials": {
      "get": {
        "tags": [
          "Work-order materials"
        ],
        "summary": "List work-order materials",
        "description": "Items and kits planned for or consumed by a job. Using or fulfilling materials moves real stock. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listWorkOrderMaterials",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkOrderMaterialsList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Work-order materials"
        ],
        "summary": "List work-order materials (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headWorkOrderMaterials",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/work-order-materials/{id}": {
      "get": {
        "tags": [
          "Work-order materials"
        ],
        "summary": "Fetch one row from work-order-materials",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getWorkOrderMaterialsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkOrderMaterialsSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Work-order materials"
        ],
        "summary": "Fetch one row from work-order-materials (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headWorkOrderMaterialsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/work-order-equipment": {
      "get": {
        "tags": [
          "Work-order equipment"
        ],
        "summary": "List work-order equipment",
        "description": "Gear reserved for a job. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listWorkOrderEquipment",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkOrderEquipmentList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Work-order equipment"
        ],
        "summary": "List work-order equipment (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headWorkOrderEquipment",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/work-order-equipment/{id}": {
      "get": {
        "tags": [
          "Work-order equipment"
        ],
        "summary": "Fetch one row from work-order-equipment",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getWorkOrderEquipmentRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkOrderEquipmentSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Work-order equipment"
        ],
        "summary": "Fetch one row from work-order-equipment (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headWorkOrderEquipmentRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/work-order-checklists": {
      "get": {
        "tags": [
          "Work-order checklists"
        ],
        "summary": "List work-order checklists",
        "description": "Checklists attached to a job. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listWorkOrderChecklists",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkOrderChecklistsList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Work-order checklists"
        ],
        "summary": "List work-order checklists (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headWorkOrderChecklists",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/work-order-checklists/{id}": {
      "get": {
        "tags": [
          "Work-order checklists"
        ],
        "summary": "Fetch one row from work-order-checklists",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getWorkOrderChecklistsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkOrderChecklistsSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Work-order checklists"
        ],
        "summary": "Fetch one row from work-order-checklists (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headWorkOrderChecklistsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/work-order-labor": {
      "get": {
        "tags": [
          "Work-order labour"
        ],
        "summary": "List work-order labour",
        "description": "Time booked against a job. hours × rate is what job costing adds up. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listWorkOrderLabor",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkOrderLaborList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Work-order labour"
        ],
        "summary": "List work-order labour (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headWorkOrderLabor",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/work-order-labor/{id}": {
      "get": {
        "tags": [
          "Work-order labour"
        ],
        "summary": "Fetch one row from work-order-labor",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getWorkOrderLaborRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkOrderLaborSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Work-order labour"
        ],
        "summary": "Fetch one row from work-order-labor (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headWorkOrderLaborRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/work-order-activity": {
      "get": {
        "tags": [
          "Work-order activity"
        ],
        "summary": "List work-order activity",
        "description": "The audit trail on a job. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listWorkOrderActivity",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkOrderActivityList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Work-order activity"
        ],
        "summary": "List work-order activity (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headWorkOrderActivity",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/work-order-activity/{id}": {
      "get": {
        "tags": [
          "Work-order activity"
        ],
        "summary": "Fetch one row from work-order-activity",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getWorkOrderActivityRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkOrderActivitySingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Work-order activity"
        ],
        "summary": "Fetch one row from work-order-activity (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headWorkOrderActivityRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_work_order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/label-templates": {
      "get": {
        "tags": [
          "Label templates"
        ],
        "summary": "List label templates",
        "description": "Saved label designs. Templates are team-wide — they are shared across every location. Soft-deleted rows are excluded unless include_deleted=true. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listLabelTemplates",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LabelTemplatesList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Label templates"
        ],
        "summary": "List label templates (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headLabelTemplates",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/label-templates/{id}": {
      "get": {
        "tags": [
          "Label templates"
        ],
        "summary": "Fetch one row from label-templates",
        "description": "One row by uuid. Soft-deleted rows are excluded unless include_deleted=true.",
        "operationId": "getLabelTemplatesRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LabelTemplatesSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Label templates"
        ],
        "summary": "Fetch one row from label-templates (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headLabelTemplatesRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/stock-movements": {
      "get": {
        "tags": [
          "Stock movements"
        ],
        "summary": "List stock movements",
        "description": "The append-only ledger of every quantity change. Rows here are never edited and never deleted, which is why this is the one collection with no updated_at and no is_deleted. Pages on ingested_at (the moment the movement reached the server); created_at is the business time the device stamped, returned but never sorted on. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listStockMovements",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_item_id"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          },
          {
            "$ref": "#/components/parameters/f_source"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by created_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StockMovementsList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Stock movements"
        ],
        "summary": "List stock movements (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headStockMovements",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_item_id"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          },
          {
            "$ref": "#/components/parameters/f_source"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/stock-movements/{id}": {
      "get": {
        "tags": [
          "Stock movements"
        ],
        "summary": "Fetch one row from stock-movements",
        "description": "One row by uuid.",
        "operationId": "getStockMovementsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_item_id"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          },
          {
            "$ref": "#/components/parameters/f_source"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StockMovementsSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Stock movements"
        ],
        "summary": "Fetch one row from stock-movements (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headStockMovementsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_item_id"
          },
          {
            "$ref": "#/components/parameters/f_location_id"
          },
          {
            "$ref": "#/components/parameters/f_source"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/item-external-refs": {
      "get": {
        "tags": [
          "Item external references"
        ],
        "summary": "List item external references",
        "description": "Maps a Stockout item to the same product in a connected system. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listItemExternalRefs",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_item_id"
          },
          {
            "$ref": "#/components/parameters/f_provider"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ItemExternalRefsList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Item external references"
        ],
        "summary": "List item external references (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headItemExternalRefs",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_item_id"
          },
          {
            "$ref": "#/components/parameters/f_provider"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/item-external-refs/{id}": {
      "get": {
        "tags": [
          "Item external references"
        ],
        "summary": "Fetch one row from item-external-refs",
        "description": "One row by uuid.",
        "operationId": "getItemExternalRefsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_item_id"
          },
          {
            "$ref": "#/components/parameters/f_provider"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ItemExternalRefsSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Item external references"
        ],
        "summary": "Fetch one row from item-external-refs (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headItemExternalRefsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          },
          {
            "$ref": "#/components/parameters/f_item_id"
          },
          {
            "$ref": "#/components/parameters/f_provider"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/integrations": {
      "get": {
        "tags": [
          "Integrations"
        ],
        "summary": "List integrations",
        "description": "Which external systems your team has connected. Credentials are never part of this collection: settings and sync_cursor are not exposed by the API at all. Pages on updated_at. Any query parameter not listed here is 400 bad_param.",
        "operationId": "listIntegrations",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of rows, oldest first by updated_at then id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationsList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Integrations"
        ],
        "summary": "List integrations (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headIntegrations",
        "parameters": [
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/cursor"
          },
          {
            "$ref": "#/components/parameters/updated_since"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/integrations/{id}": {
      "get": {
        "tags": [
          "Integrations"
        ],
        "summary": "Fetch one row from integrations",
        "description": "One row by uuid.",
        "operationId": "getIntegrationsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "The row.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationsSingle"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Integrations"
        ],
        "summary": "Fetch one row from integrations (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headIntegrationsRow",
        "parameters": [
          {
            "$ref": "#/components/parameters/rowId"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1": {
      "get": {
        "tags": [
          "Service"
        ],
        "summary": "Discovery",
        "description": "Lists every collection this API version serves, plus the endpoints that are not collections (/v1 and /v1/account). Requires a valid key - authentication happens before the path is resolved, so an anonymous caller cannot enumerate anything.",
        "operationId": "getDiscovery",
        "parameters": [
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "The collection list.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Discovery"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Service"
        ],
        "summary": "Discovery (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body. Useful as an uptime check.",
        "operationId": "headDiscovery",
        "parameters": [
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    },
    "/v1/account": {
      "get": {
        "tags": [
          "Service"
        ],
        "summary": "Account summary",
        "description": "The team behind the key: org, plan, members, devices, locations, the calling key and its rate-limit allowance. Composed from several tables; internal user ids, device ids and Stripe object ids are never included.",
        "operationId": "getAccount",
        "parameters": [
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "The account summary.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Account"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      },
      "head": {
        "tags": [
          "Service"
        ],
        "summary": "Account summary (headers only)",
        "description": "Identical to GET, returning the same status and headers with no body.",
        "operationId": "headAccount",
        "parameters": [
          {
            "$ref": "#/components/parameters/include_deleted"
          },
          {
            "$ref": "#/components/parameters/pretty"
          }
        ],
        "responses": {
          "200": {
            "description": "Same status and headers as GET, no body.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "sto_live_<64 hex>",
        "description": "An API key minted in the app under Settings > Developers > API Keys. Sent as `Authorization: Bearer sto_live_...`. Shown once at creation and never recoverable; revoking one takes effect on the next request."
      }
    },
    "headers": {
      "XRateLimitLimit": {
        "description": "Requests allowed per minute for this key.",
        "schema": {
          "type": "integer"
        }
      },
      "XRateLimitRemaining": {
        "description": "Requests left in the current minute.",
        "schema": {
          "type": "integer"
        }
      },
      "XRateLimitReset": {
        "description": "Unix epoch seconds at which the window resets.",
        "schema": {
          "type": "integer"
        }
      },
      "RetryAfter": {
        "description": "Seconds to wait before repeating the request.",
        "schema": {
          "type": "integer"
        }
      }
    },
    "parameters": {
      "limit": {
        "name": "limit",
        "in": "query",
        "required": false,
        "description": "Rows per page. Outside 1-200, or not a whole number, is 400 bad_request.",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 200,
          "default": 50
        }
      },
      "cursor": {
        "name": "cursor",
        "in": "query",
        "required": false,
        "description": "An opaque next_cursor from a previous page, passed back byte-for-byte. Do not construct or parse one; anything else is 400 bad_cursor.",
        "schema": {
          "type": "string"
        }
      },
      "updated_since": {
        "name": "updated_since",
        "in": "query",
        "required": false,
        "description": "ISO-8601 timestamp. Returns only rows whose sort column is strictly after it. A bare date is accepted. Unparseable is 400 bad_request.",
        "schema": {
          "type": "string"
        },
        "example": "2026-09-11T09:14:02.117483+00:00"
      },
      "include_deleted": {
        "name": "include_deleted",
        "in": "query",
        "required": false,
        "description": "Include soft-deleted rows. Accepted but inert on the three collections that have no is_deleted column - stock-movements, item-external-refs and integrations - so a client that appends it to every request never breaks.",
        "schema": {
          "type": "string",
          "enum": [
            "true",
            "false",
            "1",
            "0"
          ],
          "default": "false"
        }
      },
      "pretty": {
        "name": "pretty",
        "in": "query",
        "required": false,
        "description": "Set to 1 to indent the JSON with two spaces.",
        "schema": {
          "type": "string",
          "enum": [
            "1"
          ]
        }
      },
      "rowId": {
        "name": "id",
        "in": "path",
        "required": true,
        "description": "The row's uuid. Anything else is 400 bad_request.",
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "f_location_id": {
        "name": "location_id",
        "in": "query",
        "required": false,
        "description": "Only rows at this location.",
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "f_item_id": {
        "name": "item_id",
        "in": "query",
        "required": false,
        "description": "Only rows for this item.",
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "f_kit_id": {
        "name": "kit_id",
        "in": "query",
        "required": false,
        "description": "Only rows for this kit.",
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "f_equipment_id": {
        "name": "equipment_id",
        "in": "query",
        "required": false,
        "description": "Only rows for this equipment.",
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "f_checklist_id": {
        "name": "checklist_id",
        "in": "query",
        "required": false,
        "description": "Only rows for this checklist.",
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "f_folder_id": {
        "name": "folder_id",
        "in": "query",
        "required": false,
        "description": "Only rows in this folder.",
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "f_supplier_id": {
        "name": "supplier_id",
        "in": "query",
        "required": false,
        "description": "Only rows for this supplier.",
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "f_work_order_id": {
        "name": "work_order_id",
        "in": "query",
        "required": false,
        "description": "Only rows for this work order.",
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "f_customer_id": {
        "name": "customer_id",
        "in": "query",
        "required": false,
        "description": "Only work orders for this customer.",
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "f_sku": {
        "name": "sku",
        "in": "query",
        "required": false,
        "description": "Case-insensitive substring match against the whole sku field, so it also finds an item that carries several codes. % _ and \\ are escaped for you and match literally. A value containing * is rejected with 400 bad_request (\"sku cannot contain '*'.\") - it is not a wildcard, and the rewrite that happens between the API and the database cannot be escaped safely. The value is truncated at 100 characters.",
        "schema": {
          "type": "string",
          "maxLength": 100
        }
      },
      "f_source": {
        "name": "source",
        "in": "query",
        "required": false,
        "description": "Exact match on the movement's channel tag.",
        "schema": {
          "type": "string",
          "pattern": "^[A-Za-z0-9_.-]{1,64}$"
        }
      },
      "f_provider": {
        "name": "provider",
        "in": "query",
        "required": false,
        "description": "Exact match on the provider key.",
        "schema": {
          "type": "string",
          "pattern": "^[A-Za-z0-9_.-]{1,64}$"
        }
      },
      "f_status": {
        "name": "status",
        "in": "query",
        "required": false,
        "description": "Exact match on the work order's status.",
        "schema": {
          "type": "string",
          "enum": [
            "draft",
            "open",
            "in_progress",
            "on_hold",
            "completed",
            "cancelled"
          ]
        }
      }
    },
    "responses": {
      "BadRequest": {
        "description": "A malformed value (bad_request), a parameter this collection does not accept (bad_param), or a cursor this API did not issue (bad_cursor).",
        "headers": {
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/XRateLimitLimit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/XRateLimitRemaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/XRateLimitReset"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "bad_request": {
                "value": {
                  "error": "bad_request",
                  "hint": "limit must be between 1 and 200."
                }
              },
              "bad_param": {
                "value": {
                  "error": "bad_param",
                  "hint": "'locationid' is not a supported query parameter for /v1/items."
                }
              },
              "bad_cursor": {
                "value": {
                  "error": "bad_cursor",
                  "hint": "Pass back the next_cursor value exactly as returned."
                }
              }
            }
          }
        }
      },
      "Unauthorized": {
        "description": "Missing, malformed, unknown, revoked or expired API key. Decided before the rate limiter runs, so this response carries no X-RateLimit-* headers.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "unauthorized": {
                "value": {
                  "error": "unauthorized",
                  "hint": "Send 'Authorization: Bearer sto_live_…' with a key that has not been revoked or expired."
                }
              }
            }
          }
        }
      },
      "PaymentRequired": {
        "description": "The key is valid but the team has no active or trialing plan. Decided before the rate limiter runs, so this response carries no X-RateLimit-* headers.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "no_active_subscription": {
                "value": {
                  "error": "no_active_subscription",
                  "hint": "This team does not have an active Stockout plan."
                }
              }
            }
          }
        }
      },
      "NotFound": {
        "description": "No such row (not_found), or no such collection (unknown_collection). Every name that is not on the collection list behaves the same way - there is no name that is special.",
        "headers": {
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/XRateLimitLimit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/XRateLimitRemaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/XRateLimitReset"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "not_found": {
                "value": {
                  "error": "not_found",
                  "hint": "No row with that id in this team's data."
                }
              },
              "unknown_collection": {
                "value": {
                  "error": "unknown_collection",
                  "hint": "Valid collections: items, locations, kits, kit-components, equipment, equipment-log, checklists, checklist-log, folders, folder-items, suppliers, supplier-contacts, item-suppliers, customers, work-orders, work-order-materials, work-order-equipment, work-order-checklists, work-order-labor, work-order-activity, label-templates, stock-movements, item-external-refs, integrations"
                }
              }
            }
          }
        }
      },
      "MethodNotAllowed": {
        "description": "Anything other than GET, HEAD or OPTIONS. Decided before authentication and the rate limiter, so this response carries no X-RateLimit-* headers.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "method_not_allowed": {
                "value": {
                  "error": "method_not_allowed",
                  "hint": "This API is read-only; use GET or HEAD."
                }
              }
            }
          }
        }
      },
      "RateLimited": {
        "description": "Over the per-key or per-team rate limit.",
        "headers": {
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/XRateLimitLimit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/XRateLimitRemaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/XRateLimitReset"
          },
          "Retry-After": {
            "$ref": "#/components/headers/RetryAfter"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "rate_limited": {
                "value": {
                  "error": "rate_limited",
                  "hint": "60 requests per minute per API key (10000/day). Retry in 34s."
                }
              }
            }
          }
        }
      },
      "ServerError": {
        "description": "Our bug. The underlying message is logged server-side only and never returned.",
        "headers": {
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/XRateLimitLimit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/XRateLimitRemaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/XRateLimitReset"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ServerError"
            },
            "examples": {
              "server_error": {
                "value": {
                  "error": "server_error",
                  "hint": "Something went wrong on our side. Quote the request_id if you contact support.",
                  "request_id": "6b1f0c2e-9a47-4d83-8e15-2f7c40ab9d63"
                }
              }
            }
          }
        }
      },
      "ServiceUnavailable": {
        "description": "Either a dependency check failed (the key lookup or the plan check - transient, retry), or this Stockout project's database schema is older than the deployed API and a column the collection needs is missing, in which case the project's schema.sql must be re-run. The hint distinguishes them. Neither case carries X-RateLimit-* headers.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "service_unavailable": {
                "value": {
                  "error": "service_unavailable",
                  "hint": "We could not verify your API key. Please retry shortly."
                }
              },
              "needs_migration": {
                "summary": "Database schema is behind the deployed API",
                "value": {
                  "error": "service_unavailable",
                  "hint": "This collection needs a database migration that has not been run on this project yet."
                }
              }
            }
          }
        }
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "description": "Every failure body. Branch on `error`; `hint` is prose and may be reworded.",
        "properties": {
          "error": {
            "type": "string",
            "enum": [
              "bad_request",
              "bad_param",
              "bad_cursor",
              "unauthorized",
              "no_active_subscription",
              "not_found",
              "unknown_collection",
              "method_not_allowed",
              "rate_limited",
              "server_error",
              "service_unavailable"
            ],
            "description": "Stable machine-readable code."
          },
          "hint": {
            "type": "string",
            "description": "A sentence for whoever reads the logs."
          }
        }
      },
      "ServerError": {
        "type": "object",
        "required": [
          "error",
          "request_id"
        ],
        "description": "A 500 body. The raw failure is logged against request_id on our side only.",
        "properties": {
          "error": {
            "type": "string",
            "const": "server_error"
          },
          "hint": {
            "type": "string"
          },
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "Quote this to support."
          }
        }
      },
      "Discovery": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "version",
              "collections",
              "endpoints",
              "docs"
            ],
            "properties": {
              "version": {
                "type": "string",
                "const": "v1"
              },
              "collections": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Every collection this version serves."
              },
              "endpoints": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "The paths that are not collections: /v1 itself and /v1/account.",
                "examples": [
                  [
                    "/v1",
                    "/v1/account"
                  ]
                ]
              },
              "docs": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "Account": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "org",
              "plan",
              "members",
              "devices",
              "locations",
              "key",
              "rate_limit"
            ],
            "properties": {
              "org": {
                "type": "object",
                "description": "The team the key belongs to.",
                "properties": {
                  "id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "created_at": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date-time"
                  }
                }
              },
              "plan": {
                "type": "object",
                "description": "Billing state. The API only answers while status is trialing or active.",
                "properties": {
                  "plan": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "status": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "none, trialing, active, past_due or canceled."
                  },
                  "device_cap": {
                    "type": "integer",
                    "description": "Devices the plan is billed for."
                  },
                  "current_period_end": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date-time"
                  },
                  "cancel_at_period_end": {
                    "type": "boolean"
                  }
                }
              },
              "members": {
                "type": "array",
                "description": "Teammates, oldest first. Internal user ids are never included.",
                "items": {
                  "type": "object",
                  "properties": {
                    "role": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "owner, admin, user or viewer."
                    },
                    "email": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "created_at": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time"
                    }
                  }
                }
              },
              "devices": {
                "type": "array",
                "description": "Registered devices, oldest first. Device identifiers are never included.",
                "items": {
                  "type": "object",
                  "properties": {
                    "label": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "platform": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "last_seen_at": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time"
                    },
                    "created_at": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time"
                    }
                  }
                }
              },
              "locations": {
                "type": "array",
                "description": "Active and inactive locations by name; deleted ones are omitted.",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "name": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "is_active": {
                      "type": [
                        "boolean",
                        "null"
                      ]
                    }
                  }
                }
              },
              "key": {
                "type": "object",
                "description": "The calling key only. No other key is ever visible.",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "key_prefix": {
                    "type": "string",
                    "description": "First 13 characters, e.g. sto_live_9f3a."
                  },
                  "scopes": {
                    "type": "string",
                    "description": "read in v1."
                  },
                  "created_at": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "last_used_at": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date-time"
                  }
                }
              },
              "rate_limit": {
                "type": "object",
                "properties": {
                  "per_minute": {
                    "type": "integer"
                  },
                  "per_day": {
                    "type": "integer"
                  },
                  "remaining": {
                    "type": "integer",
                    "description": "Left in the current minute."
                  }
                }
              }
            }
          }
        }
      },
      "ItemsRow": {
        "type": "object",
        "description": "Everything you stock, at one location. This is the collection most integrations start with. org_id is never returned.",
        "required": [
          "id",
          "location_id",
          "name",
          "sku",
          "category",
          "quantity",
          "price_at_cost",
          "price_at_retail",
          "low_stock_threshold",
          "low_stock_is_percent",
          "near_capacity_threshold",
          "near_capacity_is_percent",
          "max_capacity",
          "description",
          "storage_location",
          "tracking_type",
          "selected_unit",
          "created_at",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key. Stable for the life of the item."
          },
          "location_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Location the item is stocked at. Deleting a location does not clear this: the location row and every item at it are both flagged is_deleted and keep their ids, so resolve the id against /v1/locations?include_deleted=true rather than waiting for a null."
          },
          "name": {
            "type": "string",
            "description": "Item name. May be an empty string."
          },
          "sku": {
            "type": "string",
            "description": "One or more codes joined with \", \" — an item can carry several barcodes. The sku filter matches any substring of this whole field."
          },
          "category": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text category."
          },
          "quantity": {
            "type": "number",
            "description": "Quantity on hand. Decimal, because weight/length/volume items are not whole numbers."
          },
          "price_at_cost": {
            "type": "number",
            "description": "What you pay per unit."
          },
          "price_at_retail": {
            "type": "number",
            "description": "What you sell for per unit."
          },
          "low_stock_threshold": {
            "type": "number",
            "description": "At or below this the item reads Low. A percentage of max_capacity when low_stock_is_percent is true."
          },
          "low_stock_is_percent": {
            "type": "boolean",
            "description": "Whether low_stock_threshold is a percentage rather than a count."
          },
          "near_capacity_threshold": {
            "type": "number",
            "description": "At or above this the item reads Near Capacity. A percentage of max_capacity when near_capacity_is_percent is true."
          },
          "near_capacity_is_percent": {
            "type": "boolean",
            "description": "Whether near_capacity_threshold is a percentage rather than a count."
          },
          "max_capacity": {
            "type": "number",
            "description": "How much the storage spot holds. 0 means capacity is not tracked."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text notes."
          },
          "storage_location": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text bin, shelf or aisle."
          },
          "tracking_type": {
            "type": "string",
            "description": "Quantity, Weight, Length or Volume."
          },
          "selected_unit": {
            "type": [
              "string",
              "null"
            ],
            "description": "Unit label (kg, ft, L…). Used when tracking_type is not Quantity."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the record was first created."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "ItemsList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ItemsRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "ItemsSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ItemsRow"
          }
        }
      },
      "LocationsRow": {
        "type": "object",
        "description": "The places you stock things. Most other collections carry a location_id pointing here. org_id is never returned.",
        "required": [
          "id",
          "name",
          "address",
          "city",
          "country",
          "is_active",
          "created_at",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key. Use it as the location_id filter elsewhere."
          },
          "name": {
            "type": "string",
            "description": "Location name."
          },
          "address": {
            "type": [
              "string",
              "null"
            ],
            "description": "Street address."
          },
          "city": {
            "type": [
              "string",
              "null"
            ],
            "description": "City."
          },
          "country": {
            "type": [
              "string",
              "null"
            ],
            "description": "Country."
          },
          "is_active": {
            "type": "boolean",
            "description": "Inactive locations stay in the data but are hidden in the apps."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the record was first created."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "LocationsList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LocationsRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "LocationsSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/LocationsRow"
          }
        }
      },
      "KitsRow": {
        "type": "object",
        "description": "Bundles built out of inventory items. Making or selling a kit moves the component items’ stock. org_id is never returned.",
        "required": [
          "id",
          "location_id",
          "name",
          "quantity_on_hand",
          "description",
          "storage_location",
          "created_at",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "location_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Location the kit belongs to."
          },
          "name": {
            "type": "string",
            "description": "Kit name."
          },
          "quantity_on_hand": {
            "type": "number",
            "description": "Built kits currently on hand."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text notes."
          },
          "storage_location": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text bin, shelf or aisle."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the record was first created."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "KitsList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KitsRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "KitsSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/KitsRow"
          }
        }
      },
      "KitComponentsRow": {
        "type": "object",
        "description": "The recipe rows joining a kit to the items it consumes. org_id is never returned.",
        "required": [
          "id",
          "kit_id",
          "item_id",
          "quantity_needed",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "kit_id": {
            "type": "string",
            "format": "uuid",
            "description": "The kit. Matches /v1/kits id."
          },
          "item_id": {
            "type": "string",
            "format": "uuid",
            "description": "The component item. Matches /v1/items id."
          },
          "quantity_needed": {
            "type": "number",
            "description": "How many of the item one kit consumes."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "KitComponentsList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KitComponentsRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "KitComponentsSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/KitComponentsRow"
          }
        }
      },
      "EquipmentRow": {
        "type": "object",
        "description": "Reusable gear that gets checked out and back in rather than consumed. org_id is never returned.",
        "required": [
          "id",
          "location_id",
          "name",
          "total_quantity",
          "description",
          "storage_location",
          "created_at",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "location_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Location the gear lives at."
          },
          "name": {
            "type": "string",
            "description": "Equipment name."
          },
          "total_quantity": {
            "type": "integer",
            "description": "How many units you own. What is available is derived from the check-out log, not stored here."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text notes."
          },
          "storage_location": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text bin, shelf or aisle."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the record was first created."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "EquipmentList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EquipmentRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "EquipmentSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/EquipmentRow"
          }
        }
      },
      "EquipmentLogRow": {
        "type": "object",
        "description": "One row per check-out or check-in. Subtract the check-ins from the check-outs to get what is still out. org_id is never returned.",
        "required": [
          "id",
          "equipment_id",
          "employee_first",
          "employee_last",
          "is_check_out",
          "quantity",
          "occurred_at",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "equipment_id": {
            "type": "string",
            "format": "uuid",
            "description": "The equipment. Matches /v1/equipment id."
          },
          "employee_first": {
            "type": "string",
            "description": "First name typed at the time."
          },
          "employee_last": {
            "type": "string",
            "description": "Last name typed at the time."
          },
          "is_check_out": {
            "type": "boolean",
            "description": "true = taken out, false = brought back."
          },
          "quantity": {
            "type": "integer",
            "description": "How many units this row moves."
          },
          "occurred_at": {
            "type": "string",
            "format": "date-time",
            "description": "When it happened, supplied by the app. It can be backdated, so it is never the sort column — page and filter on updated_at."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "EquipmentLogList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EquipmentLogRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "EquipmentLogSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/EquipmentLogRow"
          }
        }
      },
      "ChecklistsRow": {
        "type": "object",
        "description": "Reusable checklists your team runs and ticks off. org_id is never returned.",
        "required": [
          "id",
          "location_id",
          "name",
          "description",
          "items_json",
          "created_at",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "location_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Location the checklist belongs to."
          },
          "name": {
            "type": "string",
            "description": "Checklist name."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text notes."
          },
          "items_json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "The checklist’s steps, as a JSON string — not an object. See JSON held in text fields."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the record was first created."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "ChecklistsList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChecklistsRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "ChecklistsSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ChecklistsRow"
          }
        }
      },
      "ChecklistLogRow": {
        "type": "object",
        "description": "One row per completed run of a checklist. org_id is never returned.",
        "required": [
          "id",
          "checklist_id",
          "employee_first",
          "employee_last",
          "started_at",
          "completed_at",
          "completed_count",
          "total_count",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "checklist_id": {
            "type": "string",
            "format": "uuid",
            "description": "The checklist. Matches /v1/checklists id."
          },
          "employee_first": {
            "type": "string",
            "description": "First name typed at the time."
          },
          "employee_last": {
            "type": "string",
            "description": "Last name typed at the time."
          },
          "started_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the run began, supplied by the app. Never the sort column."
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "description": "When Complete was tapped, supplied by the app. Never the sort column."
          },
          "completed_count": {
            "type": "integer",
            "description": "How many steps were ticked."
          },
          "total_count": {
            "type": "integer",
            "description": "How many steps the checklist had at the time."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "ChecklistLogList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChecklistLogRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "ChecklistLogSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ChecklistLogRow"
          }
        }
      },
      "FoldersRow": {
        "type": "object",
        "description": "Named collections that reference other records. A folder holds pointers, never copies. org_id is never returned.",
        "required": [
          "id",
          "location_id",
          "name",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "location_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Location the folder belongs to."
          },
          "name": {
            "type": "string",
            "description": "Folder name."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "FoldersList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FoldersRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "FoldersSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/FoldersRow"
          }
        }
      },
      "FolderItemsRow": {
        "type": "object",
        "description": "The pointers inside a folder. Each row names a kind and an id in the matching collection. org_id is never returned.",
        "required": [
          "id",
          "folder_id",
          "entity_type",
          "entity_id",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "folder_id": {
            "type": "string",
            "format": "uuid",
            "description": "The folder. Matches /v1/folders id."
          },
          "entity_type": {
            "type": "string",
            "description": "item, kit, equipment, checklist, label_template, supplier, work_order or customer."
          },
          "entity_id": {
            "type": "string",
            "format": "uuid",
            "description": "The referenced row’s id, in the collection entity_type names."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "FolderItemsList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FolderItemsRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "FolderItemsSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/FolderItemsRow"
          }
        }
      },
      "SuppliersRow": {
        "type": "object",
        "description": "Your vendor directory. Suppliers are team-wide, not tied to a location. org_id is never returned.",
        "required": [
          "id",
          "name",
          "portal_urls",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "name": {
            "type": "string",
            "description": "Supplier name."
          },
          "portal_urls": {
            "type": [
              "string",
              "null"
            ],
            "description": "Ordering-portal links, one per line or comma-separated."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "SuppliersList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SuppliersRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "SuppliersSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/SuppliersRow"
          }
        }
      },
      "SupplierContactsRow": {
        "type": "object",
        "description": "People at a supplier. org_id is never returned.",
        "required": [
          "id",
          "supplier_id",
          "name",
          "phone",
          "email",
          "role",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "supplier_id": {
            "type": "string",
            "format": "uuid",
            "description": "The supplier. Matches /v1/suppliers id."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Contact name."
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Phone number, as typed."
          },
          "email": {
            "type": [
              "string",
              "null"
            ],
            "description": "Email address, as typed."
          },
          "role": {
            "type": [
              "string",
              "null"
            ],
            "description": "Job title or role."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "SupplierContactsList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SupplierContactsRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "SupplierContactsSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/SupplierContactsRow"
          }
        }
      },
      "ItemSuppliersRow": {
        "type": "object",
        "description": "The join table saying which suppliers can provide which item. org_id is never returned.",
        "required": [
          "id",
          "item_id",
          "supplier_id",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "item_id": {
            "type": "string",
            "format": "uuid",
            "description": "Matches /v1/items id."
          },
          "supplier_id": {
            "type": "string",
            "format": "uuid",
            "description": "Matches /v1/suppliers id."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "ItemSuppliersList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ItemSuppliersRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "ItemSuppliersSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ItemSuppliersRow"
          }
        }
      },
      "CustomersRow": {
        "type": "object",
        "description": "Who work orders are done for. Customers are team-wide, not tied to a location. org_id is never returned.",
        "required": [
          "id",
          "name",
          "contact_name",
          "phone",
          "email",
          "address",
          "notes",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "name": {
            "type": "string",
            "description": "Company or customer name."
          },
          "contact_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Main contact person."
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Phone number, as typed."
          },
          "email": {
            "type": [
              "string",
              "null"
            ],
            "description": "Email address, as typed."
          },
          "address": {
            "type": [
              "string",
              "null"
            ],
            "description": "Address, as typed."
          },
          "notes": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text notes."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "CustomersList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CustomersRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "CustomersSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/CustomersRow"
          }
        }
      },
      "WorkOrdersRow": {
        "type": "object",
        "description": "Jobs with materials, labour, equipment and checklists hanging off them. org_id is never returned.",
        "required": [
          "id",
          "location_id",
          "number",
          "title",
          "customer_id",
          "status",
          "priority",
          "assigned_to",
          "scheduled_date",
          "due_date",
          "completed_at",
          "amount_charged",
          "notes",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "location_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Location the job belongs to."
          },
          "number": {
            "type": "integer",
            "description": "Per-team sequence number, shown in the apps as WO-<number>."
          },
          "title": {
            "type": [
              "string",
              "null"
            ],
            "description": "Short job title."
          },
          "customer_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Matches /v1/customers id. Null for an internal job."
          },
          "status": {
            "type": "string",
            "description": "draft, open, in_progress, on_hold, completed or cancelled."
          },
          "priority": {
            "type": "string",
            "description": "low, normal, high or urgent."
          },
          "assigned_to": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text name of whoever owns the job."
          },
          "scheduled_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "When the job is booked in."
          },
          "due_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "When the job is due."
          },
          "completed_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "When the job was completed, supplied by the app. Never the sort column."
          },
          "amount_charged": {
            "type": [
              "number",
              "null"
            ],
            "description": "What the customer is billed. Feeds the margin in the cost summary."
          },
          "notes": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text notes."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "WorkOrdersList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkOrdersRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "WorkOrdersSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/WorkOrdersRow"
          }
        }
      },
      "WorkOrderMaterialsRow": {
        "type": "object",
        "description": "Items and kits planned for or consumed by a job. Using or fulfilling materials moves real stock. org_id is never returned.",
        "required": [
          "id",
          "work_order_id",
          "entity_type",
          "entity_id",
          "qty_planned",
          "qty_used",
          "unit_cost",
          "unit_price",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "work_order_id": {
            "type": "string",
            "format": "uuid",
            "description": "Matches /v1/work-orders id."
          },
          "entity_type": {
            "type": "string",
            "description": "item or kit."
          },
          "entity_id": {
            "type": "string",
            "format": "uuid",
            "description": "The referenced row’s id, in the collection entity_type names."
          },
          "qty_planned": {
            "type": "number",
            "description": "How much the job expects to use."
          },
          "qty_used": {
            "type": "number",
            "description": "How much has actually been pulled from stock."
          },
          "unit_cost": {
            "type": "number",
            "description": "Cost per unit, snapshotted when the line was added."
          },
          "unit_price": {
            "type": "number",
            "description": "Retail per unit, snapshotted when the line was added."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "WorkOrderMaterialsList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkOrderMaterialsRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "WorkOrderMaterialsSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/WorkOrderMaterialsRow"
          }
        }
      },
      "WorkOrderEquipmentRow": {
        "type": "object",
        "description": "Gear reserved for a job. org_id is never returned.",
        "required": [
          "id",
          "work_order_id",
          "equipment_id",
          "quantity",
          "checked_out",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "work_order_id": {
            "type": "string",
            "format": "uuid",
            "description": "Matches /v1/work-orders id."
          },
          "equipment_id": {
            "type": "string",
            "format": "uuid",
            "description": "Matches /v1/equipment id."
          },
          "quantity": {
            "type": "integer",
            "description": "How many units are reserved."
          },
          "checked_out": {
            "type": "boolean",
            "description": "Whether the gear has actually left the shelf for this job."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "WorkOrderEquipmentList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkOrderEquipmentRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "WorkOrderEquipmentSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/WorkOrderEquipmentRow"
          }
        }
      },
      "WorkOrderChecklistsRow": {
        "type": "object",
        "description": "Checklists attached to a job. org_id is never returned.",
        "required": [
          "id",
          "work_order_id",
          "checklist_id",
          "completed",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "work_order_id": {
            "type": "string",
            "format": "uuid",
            "description": "Matches /v1/work-orders id."
          },
          "checklist_id": {
            "type": "string",
            "format": "uuid",
            "description": "Matches /v1/checklists id."
          },
          "completed": {
            "type": "boolean",
            "description": "Whether this checklist has been finished for this job."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "WorkOrderChecklistsList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkOrderChecklistsRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "WorkOrderChecklistsSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/WorkOrderChecklistsRow"
          }
        }
      },
      "WorkOrderLaborRow": {
        "type": "object",
        "description": "Time booked against a job. hours × rate is what job costing adds up. org_id is never returned.",
        "required": [
          "id",
          "work_order_id",
          "employee",
          "hours",
          "rate",
          "notes",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "work_order_id": {
            "type": "string",
            "format": "uuid",
            "description": "Matches /v1/work-orders id."
          },
          "employee": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text name."
          },
          "hours": {
            "type": "number",
            "description": "Hours booked."
          },
          "rate": {
            "type": "number",
            "description": "Hourly rate used for costing."
          },
          "notes": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text notes."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "WorkOrderLaborList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkOrderLaborRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "WorkOrderLaborSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/WorkOrderLaborRow"
          }
        }
      },
      "WorkOrderActivityRow": {
        "type": "object",
        "description": "The audit trail on a job. org_id is never returned.",
        "required": [
          "id",
          "work_order_id",
          "kind",
          "detail",
          "occurred_at",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "work_order_id": {
            "type": "string",
            "format": "uuid",
            "description": "Matches /v1/work-orders id."
          },
          "kind": {
            "type": [
              "string",
              "null"
            ],
            "description": "What kind of event this was, as free text."
          },
          "detail": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text detail."
          },
          "occurred_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the event happened, supplied by the app. Never the sort column."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "WorkOrderActivityList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkOrderActivityRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "WorkOrderActivitySingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/WorkOrderActivityRow"
          }
        }
      },
      "LabelTemplatesRow": {
        "type": "object",
        "description": "Saved label designs. Templates are team-wide — they are shared across every location. org_id is never returned.",
        "required": [
          "id",
          "name",
          "width_in",
          "height_in",
          "elements_json",
          "updated_at",
          "is_deleted"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "name": {
            "type": "string",
            "description": "Template name."
          },
          "width_in": {
            "type": "number",
            "description": "Label width in inches."
          },
          "height_in": {
            "type": "number",
            "description": "Label height in inches."
          },
          "elements_json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "The template’s fields, as a JSON string — not an object. See JSON held in text fields."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          },
          "is_deleted": {
            "type": "boolean",
            "description": "true once the record has been deleted in the app. See Deleted rows."
          }
        }
      },
      "LabelTemplatesList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LabelTemplatesRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "LabelTemplatesSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/LabelTemplatesRow"
          }
        }
      },
      "StockMovementsRow": {
        "type": "object",
        "description": "The append-only ledger of every quantity change. Rows here are never edited and never deleted, which is why this is the one collection with no updated_at and no is_deleted. org_id is never returned.",
        "required": [
          "id",
          "item_id",
          "location_id",
          "delta",
          "reason",
          "source",
          "created_at",
          "ingested_at"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "item_id": {
            "type": "string",
            "format": "uuid",
            "description": "Matches /v1/items id."
          },
          "location_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Where the movement happened."
          },
          "delta": {
            "type": "number",
            "description": "Signed change in quantity. Negative means stock left."
          },
          "reason": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text reason written by the app."
          },
          "source": {
            "type": [
              "string",
              "null"
            ],
            "description": "Structured channel tag, e.g. an integration name. Null for movements made in the apps."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the stock actually moved. The device stamps this, so a phone that was offline can write a movement dated yesterday - which is why it is not the sort column."
          },
          "ingested_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the movement reached the server. Set by the database, never by a device, so it only ever moves forward. This is the sort column: updated_since and cursor both work on it."
          }
        }
      },
      "StockMovementsList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StockMovementsRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "StockMovementsSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/StockMovementsRow"
          }
        }
      },
      "ItemExternalRefsRow": {
        "type": "object",
        "description": "Maps a Stockout item to the same product in a connected system. org_id is never returned.",
        "required": [
          "id",
          "item_id",
          "provider",
          "external_id",
          "sku",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "item_id": {
            "type": "string",
            "format": "uuid",
            "description": "Matches /v1/items id."
          },
          "provider": {
            "type": "string",
            "description": "Which system the reference belongs to."
          },
          "external_id": {
            "type": "string",
            "description": "That system’s product or variant id."
          },
          "sku": {
            "type": [
              "string",
              "null"
            ],
            "description": "That system’s SKU, when it has one."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          }
        }
      },
      "ItemExternalRefsList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ItemExternalRefsRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "ItemExternalRefsSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ItemExternalRefsRow"
          }
        }
      },
      "IntegrationsRow": {
        "type": "object",
        "description": "Which external systems your team has connected. Credentials are never part of this collection: settings and sync_cursor are not exposed by the API at all. org_id is never returned.",
        "required": [
          "id",
          "provider",
          "status",
          "external_id",
          "last_sync_at",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Primary key."
          },
          "provider": {
            "type": "string",
            "description": "Which system is connected."
          },
          "status": {
            "type": "string",
            "description": "connected, error or disconnected."
          },
          "external_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "The provider’s shop or account id."
          },
          "last_sync_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Last successful sync, or null if it has never run."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the record was first created."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last time any field changed. Sort column for this collection."
          }
        }
      },
      "IntegrationsList": {
        "type": "object",
        "required": [
          "data",
          "next_cursor",
          "has_more"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/IntegrationsRow"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as ?cursor= for the next page; null when has_more is false."
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "IntegrationsSingle": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/IntegrationsRow"
          }
        }
      }
    }
  }
}
