{
  "info": {
    "name": "quipteams API v1",
    "description": "Programmatic access to the quipteams platform. Set the collection variables `baseUrl` and `apiKey`.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{apiKey}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://app.quipteams.com/api/v1"
    },
    {
      "key": "apiKey",
      "value": "",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Quotes",
      "item": [
        {
          "name": "GET List quotes",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/quotes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "quotes"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "disabled": true,
                  "description": "Filter by quote status (in_progress, pending, approved, shipping, delivered, cancelled, rejected)."
                },
                {
                  "key": "country",
                  "value": "",
                  "disabled": true,
                  "description": "Filter by quote country. Matches any spelling of the country (e.g. `AR` and `Argentina` both match)."
                },
                {
                  "key": "recipient_email",
                  "value": "",
                  "disabled": true,
                  "description": "Only quotes with at least one recipient whose email matches (case-insensitive exact match)."
                },
                {
                  "key": "created_after",
                  "value": "",
                  "disabled": true,
                  "description": "ISO date/datetime lower bound on created_at (inclusive)."
                },
                {
                  "key": "created_before",
                  "value": "",
                  "disabled": true,
                  "description": "ISO date/datetime upper bound on created_at (inclusive)."
                },
                {
                  "key": "sort",
                  "value": "",
                  "disabled": true,
                  "description": "One of: created_at, id, status, company_name. Prefix with `-` for descending. Default `-created_at`. Unknown fields return 400 VALIDATION_ERROR."
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "Rows per page. Default 25, max 100."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "Opaque keyset cursor - pass `meta.next_cursor` from the previous page."
                }
              ]
            },
            "description": "Returns quotes for your company, most recent first, with keyset cursor pagination. `items_count` is the number of items on each quote - read a single quote for the items themselves."
          }
        },
        {
          "name": "POST Create a quote",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/quotes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "quotes"
              ]
            },
            "description": "Creates a quote and starts fulfillment asynchronously (returns 202 with the full quote detail). Each item references EITHER a catalog `product_id` OR a `kit_id` - exactly one. Per item, the sum of recipient quantities must equal the item quantity.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"requester_email\": \"jane@acme.com\",\n  \"requester_name\": \"Jane Smith\",\n  \"po_number\": \"PO-9981\",\n  \"notification_emails\": [\"it@acme.com\"],\n  \"items\": [\n    {\n      \"product_id\": \"6f9d0e2a-1b3c-4d5e-8f70-2a1b3c4d5e6f\",\n      \"quantity\": 2,\n      \"comments\": \"Ship together if possible\",\n      \"recipients\": [\n        {\n          \"name\": \"Alex Doe\",\n          \"email\": \"alex@acme.com\",\n          \"country\": \"United States\",\n          \"address\": \"123 Market St, San Francisco, CA 94103\",\n          \"phone_number\": \"+1 415 555 0100\",\n          \"when_to_contact\": \"2026-03-01\",\n          \"quantity\": 1\n        },\n        {\n          \"office_id\": \"3f2b9c4e-6a1d-4f8b-9c2e-7d5a1b3c9e4f\",\n          \"quantity\": 1\n        }\n      ]\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "GET Get a quote",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/quotes/{id}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "quotes",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Returns the full quote by order id or internal id, including items, recipients, and alternatives. Item status uses the legacy vocabulary (pending, accepted, rejected, unavailable). An id belonging to another company responds 404 - never 403."
          }
        },
        {
          "name": "POST Accept or reject an item",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/quotes/{id}/items/{itemId}/action",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "quotes",
                ":id",
                "items",
                ":itemId",
                "action"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                },
                {
                  "key": "itemId",
                  "value": ""
                }
              ]
            },
            "description": "Marks a quote item as accepted or rejected. `{itemId}` may be a line item id OR an alternative id (auto-detected). Accepting an item rejects its pending alternatives; accepting an alternative rejects its siblings.",
            "body": {
              "mode": "raw",
              "raw": "{ \"action\": \"accept\" }",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "PATCH Decide an item with recipients",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/quotes/{id}/items/{itemId}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "quotes",
                ":id",
                "items",
                ":itemId"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                },
                {
                  "key": "itemId",
                  "value": ""
                }
              ]
            },
            "description": "Same decision cascade as the action endpoint, with two extras: `alternative_id` targets one of the item's alternatives, and `recipients` (required on accept) replaces the item's recipient list before the decision runs.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"action\": \"accept\",\n  \"recipients\": [\n    {\n      \"name\": \"Alex Doe\",\n      \"email\": \"alex@acme.com\",\n      \"country\": \"United States\",\n      \"address\": \"123 Market St, San Francisco, CA 94103\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "Assets",
      "item": [
        {
          "name": "GET List assets",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/assets",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "assets"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "disabled": true,
                  "description": "in_storage (default), in_use, or all."
                },
                {
                  "key": "country",
                  "value": "",
                  "disabled": true,
                  "description": "Filter by country."
                },
                {
                  "key": "device_type",
                  "value": "",
                  "disabled": true,
                  "description": "Match on device_type or model (e.g. Laptop, Monitor)."
                },
                {
                  "key": "serial_number",
                  "value": "",
                  "disabled": true,
                  "description": "Filter by serial number."
                },
                {
                  "key": "search",
                  "value": "",
                  "disabled": true,
                  "description": "Free-text search over serial, description, and employee."
                },
                {
                  "key": "item_id",
                  "value": "",
                  "disabled": true,
                  "description": "Only devices linked to this quote item (UUID)."
                },
                {
                  "key": "updated_after",
                  "value": "",
                  "disabled": true,
                  "description": "ISO timestamp lower bound on updated_at."
                },
                {
                  "key": "sort",
                  "value": "",
                  "disabled": true,
                  "description": "One of: created_at, updated_at, id, status, serial_number, device_type, country. Prefix with `-` for descending. Default `-created_at`. Unknown fields return 400 VALIDATION_ERROR."
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "Rows per page. Default 25, max 100."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "Opaque keyset cursor - pass `meta.next_cursor` from the previous page."
                }
              ]
            },
            "description": "Returns inventory devices. `status` defaults to `in_storage`; `in_use` rows additionally carry `purchase_order` and `assigned_date`."
          }
        },
        {
          "name": "GET Get an asset",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/assets/{id_or_serial}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "assets",
                ":id_or_serial"
              ],
              "variable": [
                {
                  "key": "id_or_serial",
                  "value": ""
                }
              ]
            },
            "description": "Returns a single asset. `{id_or_serial}` is matched as a UUID against the device id, otherwise looked up by serial number. Responds 403 if the asset belongs to another company."
          }
        }
      ]
    },
    {
      "name": "Devices",
      "item": [
        {
          "name": "POST Add devices",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/devices",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "devices"
              ]
            },
            "description": "Accepts a single device object, a bare array, or `{ \"devices\": [...] }` (max 100). A single-object body returns a single asset; a bulk body returns an array. A serial already registered to your company returns 409 CONFLICT.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"devices\": [\n    {\n      \"serial_number\": \"C02X5K3JMD6T\",\n      \"device_type\": \"Laptop\",\n      \"country\": \"United States\",\n      \"description\": \"MacBook Pro 14 M5 Pro\",\n      \"condition\": \"Good\",\n      \"cost\": 2199\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "Device actions",
      "item": [
        {
          "name": "GET List device actions",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/device-actions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "device-actions"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "disabled": true,
                  "description": "In Progress, Coordinated, Completed, or Cancelled (case-insensitive; `in_progress` also works)."
                },
                {
                  "key": "action_type",
                  "value": "",
                  "disabled": true,
                  "description": "Store, Assign, Reassign, Sell, or Support."
                },
                {
                  "key": "serial_number",
                  "value": "",
                  "disabled": true,
                  "description": "Substring match on the device serial number."
                },
                {
                  "key": "recipient_email",
                  "value": "",
                  "disabled": true,
                  "description": "Case-insensitive exact match on the current user OR new recipient email."
                },
                {
                  "key": "created_after",
                  "value": "",
                  "disabled": true,
                  "description": "ISO lower bound on created_at (inclusive)."
                },
                {
                  "key": "created_before",
                  "value": "",
                  "disabled": true,
                  "description": "ISO upper bound on created_at (inclusive)."
                },
                {
                  "key": "include_asset",
                  "value": "",
                  "disabled": true,
                  "description": "When true, embeds the matching inventory device as `asset` on each row."
                },
                {
                  "key": "sort",
                  "value": "",
                  "disabled": true,
                  "description": "One of: created_at, id, status, action_type. Prefix with `-` for descending. Default `-created_at`. Unknown fields return 400 VALIDATION_ERROR."
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "Rows per page. Default 25, max 100."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "Opaque keyset cursor - pass `meta.next_cursor` from the previous page."
                }
              ]
            },
            "description": "Returns device actions for your company, most recent first, with keyset cursor pagination. `status` uses the legacy display vocabulary (In Progress, Coordinated, Completed, Cancelled)."
          }
        },
        {
          "name": "POST Create a device action",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/device-actions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "device-actions"
              ]
            },
            "description": "Creates an action for a device already in your inventory (looked up by serial). `Assign`/`Reassign` require `new_recipient`. Returns 409 if an action is already open on the device (or a wipe is pending, for any action except Sell). Starts fulfillment asynchronously (202) and returns the detail shape with `comments: []`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"serial_number\": \"C02X5K3JMD6T\",\n  \"action_type\": \"Reassign\",\n  \"current_user\": {\n    \"name\": \"Alex Doe\",\n    \"email\": \"alex@acme.com\",\n    \"country\": \"United States\",\n    \"address\": \"123 Market St, San Francisco, CA 94103\"\n  },\n  \"new_recipient\": {\n    \"name\": \"Sam Lee\",\n    \"email\": \"sam@acme.com\",\n    \"country\": \"United States\",\n    \"address\": \"500 Congress Ave, Austin, TX 78701\"\n  },\n  \"wipe\": true,\n  \"notes\": \"Employee change - wipe before reassigning\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST Create an external device action",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/device-actions/external",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "device-actions",
                "external"
              ]
            },
            "description": "Like `POST /device-actions`, but for a device that is NOT in your inventory. Requires device metadata (model or description, type or device_type, country) and always requires `current_user`. Returns 400 if the serial is actually in inventory. Responds 202 with the same detail shape.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"serial_number\": \"5CD1234ABC\",\n  \"action_type\": \"Support\",\n  \"device_type\": \"Laptop\",\n  \"model\": \"Dell XPS 13\",\n  \"country\": \"United Kingdom\",\n  \"current_user\": {\n    \"name\": \"Jordan Price\",\n    \"email\": \"jordan@acme.com\",\n    \"country\": \"United Kingdom\",\n    \"address\": \"10 King St, London EC2V 8EA\"\n  },\n  \"notes\": \"Keyboard replacement\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "GET Get a device action",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/device-actions/{id}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "device-actions",
                ":id"
              ],
              "query": [
                {
                  "key": "include_asset",
                  "value": "",
                  "disabled": true,
                  "description": "When true, embeds the linked device as `asset`."
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Returns a single action by customer-facing action id (AST...) or internal id. The detail shape adds notes, status_timestamps, notification_emails, batch_id, requested_by, user_email, and comments[]. Pass `include_asset=true` to embed the linked inventory device as `asset` (null when unmatched). An id belonging to another company responds 404."
          }
        }
      ]
    },
    {
      "name": "Products",
      "item": [
        {
          "name": "GET List products",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/products",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "products"
              ],
              "query": [
                {
                  "key": "product_type",
                  "value": "",
                  "disabled": true,
                  "description": "Filter by type (e.g. Laptop, Monitor)."
                },
                {
                  "key": "brand",
                  "value": "",
                  "disabled": true,
                  "description": "Filter by brand (exact match)."
                },
                {
                  "key": "search",
                  "value": "",
                  "disabled": true,
                  "description": "Free-text search over brand and model."
                },
                {
                  "key": "include_inactive",
                  "value": "",
                  "disabled": true,
                  "description": "When true, includes inactive products."
                },
                {
                  "key": "cpu",
                  "value": "",
                  "disabled": true,
                  "description": "Spec filter, e.g. `cpu=M3,M4`. Same for ram, storage, screen_size, resolution, connection_type."
                },
                {
                  "key": "ram",
                  "value": "",
                  "disabled": true,
                  "description": "Spec filter (comma-separated values)."
                },
                {
                  "key": "storage",
                  "value": "",
                  "disabled": true,
                  "description": "Spec filter (comma-separated values)."
                },
                {
                  "key": "screen_size",
                  "value": "",
                  "disabled": true,
                  "description": "Spec filter (comma-separated values)."
                },
                {
                  "key": "resolution",
                  "value": "",
                  "disabled": true,
                  "description": "Spec filter (comma-separated values)."
                },
                {
                  "key": "connection_type",
                  "value": "",
                  "disabled": true,
                  "description": "Spec filter (comma-separated values)."
                }
              ]
            },
            "description": "Returns active products by default, with only their active, quotable configurations. Spec filters take comma-separated values (OR within a key, AND across keys, case-insensitive substring match); products left with no matching configuration drop out. `meta.available_filters` lists every filterable value in the catalog."
          }
        },
        {
          "name": "GET Get a product",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/products/{id}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "products",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Returns a single product with its active configurations. Any miss (including a malformed id) responds 404 \"Product not found\"."
          }
        }
      ]
    },
    {
      "name": "Kits",
      "item": [
        {
          "name": "GET List kits",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kits",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kits"
              ],
              "query": [
                {
                  "key": "search",
                  "value": "",
                  "disabled": true,
                  "description": "Filter by kit name."
                },
                {
                  "key": "tag",
                  "value": "",
                  "disabled": true,
                  "description": "Filter by tag."
                },
                {
                  "key": "region",
                  "value": "",
                  "disabled": true,
                  "description": "Filter by region."
                },
                {
                  "key": "sort",
                  "value": "",
                  "disabled": true,
                  "description": "One of: created_at, updated_at, name. Prefix with `-` for descending. Default `-created_at`. Unknown fields return 400 VALIDATION_ERROR."
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "Rows per page. Default 25, max 100."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "Opaque keyset cursor - pass `meta.next_cursor` from the previous page."
                }
              ]
            },
            "description": "Returns kits for your company with keyset cursor pagination. List rows carry `devices_count` - read a single kit for the devices themselves."
          }
        },
        {
          "name": "GET Get a kit",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kits/{id}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kits",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Returns a single kit with its devices. Each device carries a sparse `specification` object (camelCase keys - only set values appear). An id belonging to another company responds 404."
          }
        }
      ]
    },
    {
      "name": "Roles",
      "item": [
        {
          "name": "GET List roles",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/roles",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "roles"
              ],
              "query": [
                {
                  "key": "search",
                  "value": "",
                  "disabled": true,
                  "description": "Filter by role name."
                },
                {
                  "key": "sort",
                  "value": "",
                  "disabled": true,
                  "description": "One of: created_at, updated_at, name. Prefix with `-` for descending. Default `-created_at`. Unknown fields return 400 VALIDATION_ERROR."
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "Rows per page. Default 25, max 100."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "Opaque keyset cursor - pass `meta.next_cursor` from the previous page."
                }
              ]
            },
            "description": "Returns roles for your company with keyset cursor pagination. List rows carry `kit_ids`. Read a single role for kit names."
          }
        },
        {
          "name": "GET Get a role",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/roles/{id}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "roles",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Returns a single role with its kits. An id belonging to another company responds 404."
          }
        }
      ]
    },
    {
      "name": "Equip",
      "item": [
        {
          "name": "POST Equip an employee with a kit",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/equip",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "equip"
              ]
            },
            "description": "Equips an employee with a saved kit. If a new stored device is available for every item in their region, the devices are assigned; otherwise, a quote is created for the full kit. Used or returned units are never assigned. Use `dry_run: true` to check availability without creating anything.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"kit_id\": \"8c1f2d3e-4a5b-4c6d-9e70-1f2a3b4c5d6e\",\n  \"recipient\": {\n    \"name\": \"Ana Silva\",\n    \"email\": \"ana.silva@acme.com\",\n    \"country\": \"ES\",\n    \"address\": \"Calle Gran Via 1, Madrid\",\n    \"phone\": \"600123456\",\n    \"phone_country_code\": \"+34\",\n    \"when_to_contact\": \"2026-08-03\"\n  },\n  \"requester_email\": \"it@acme.com\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST Equip an employee by role",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/equip-by-role",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "equip-by-role"
              ]
            },
            "description": "Equips an employee with one of a role's kits. Nothing is assigned or quoted at call time: the employee receives a scheduling link where they confirm their details and, when the role has more than one kit, pick the kit they want. The stock check runs when they submit the form. Devices in stock are assigned; otherwise the whole kit is quoted. A role with no kits answers 400 and creates nothing.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"role_id\": \"3c4d5e6f-7a8b-4910-a1b2-c3d4e5f60718\",\n  \"recipient\": {\n    \"name\": \"Ana Silva\",\n    \"email\": \"ana.silva@acme.com\",\n    \"country\": \"ES\"\n  },\n  \"requester_email\": \"it@acme.com\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "Employees",
      "item": [
        {
          "name": "GET List employees",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/employees",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "employees"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "disabled": true,
                  "description": "Filter by employment_status (e.g. ACTIVE, TERMINATED)."
                },
                {
                  "key": "search",
                  "value": "",
                  "disabled": true,
                  "description": "Free-text search over name, email, and job title."
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "Rows per page. Default 25, max 100."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "Opaque keyset cursor - pass `meta.next_cursor` from the previous page."
                }
              ]
            },
            "description": "Returns employees synced from your connected HRIS, ordered by display name, with keyset cursor pagination. `sort` is accepted but ignored. `work_location` is the HRIS location object (or null)."
          }
        },
        {
          "name": "GET Get an employee",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/employees/{id}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "employees",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Returns a single employee. An id belonging to another company responds 404."
          }
        }
      ]
    },
    {
      "name": "Offices",
      "item": [
        {
          "name": "GET List offices",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/offices",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "offices"
              ],
              "query": [
                {
                  "key": "country",
                  "value": "",
                  "disabled": true,
                  "description": "Filter by country (exact match)."
                },
                {
                  "key": "search",
                  "value": "",
                  "disabled": true,
                  "description": "Free-text search over office name and address."
                },
                {
                  "key": "sort",
                  "value": "",
                  "disabled": true,
                  "description": "One of: created_at, office_name, country. Prefix with `-` for descending. Default `office_name`. Unknown fields return 400 VALIDATION_ERROR."
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "Rows per page. Default 25, max 100."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "Opaque keyset cursor - pass `meta.next_cursor` from the previous page."
                }
              ]
            },
            "description": "Returns offices for your company, office name ascending by default, with keyset cursor pagination."
          }
        }
      ]
    },
    {
      "name": "Scheduling links",
      "item": [
        {
          "name": "GET List scheduling links",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/scheduling-links",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "scheduling-links"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "disabled": true,
                  "description": "One of: pending, pending_notification, submitted, completed, expired. Anything else returns 400."
                },
                {
                  "key": "source_type",
                  "value": "",
                  "disabled": true,
                  "description": "`quote` or `device_action`. Anything else returns 400."
                },
                {
                  "key": "recipient_email",
                  "value": "",
                  "disabled": true,
                  "description": "Filter by recipient email (exact match)."
                },
                {
                  "key": "sort",
                  "value": "",
                  "disabled": true,
                  "description": "One of: created_at, updated_at, id, status. Prefix with `-` for descending. Default `-created_at`. Unknown fields return 400 VALIDATION_ERROR."
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "Rows per page. Default 25, max 100."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "Opaque keyset cursor - pass `meta.next_cursor` from the previous page."
                }
              ]
            },
            "description": "Returns scheduling requests for your company with keyset cursor pagination. `source_type` is `quote` (with `quote_id` + `item_recipient_id` set) or `device_action` (with `device_action_id` set)."
          }
        },
        {
          "name": "GET Get a scheduling link",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/scheduling-links/{id}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "scheduling-links",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Returns a single scheduling link. Any miss (unknown id, malformed id, or another company's link) responds 404 \"Scheduling link not found\"."
          }
        }
      ]
    },
    {
      "name": "Webhooks",
      "item": [
        {
          "name": "GET List webhook endpoints",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks"
              ]
            },
            "description": "Returns all webhook endpoints for your company."
          }
        },
        {
          "name": "POST Create a webhook endpoint",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks"
              ]
            },
            "description": "Registers an endpoint. The signing `secret` (prefix `whsec_`) is returned exactly once in this response - store it now; it is never shown again. `url` must be HTTPS (localhost is allowed for testing).",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com/hooks/quipteams\",\n  \"events\": [\"quote.*\", \"device_action.status\"],\n  \"description\": \"Production order + logistics events\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "GET Get a webhook endpoint",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks/{id}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Returns the endpoint plus its 20 most recent delivery attempts."
          }
        },
        {
          "name": "PATCH Update a webhook endpoint",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks/{id}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Updates any of url, events, description, or is_active. Omitted fields are unchanged.",
            "body": {
              "mode": "raw",
              "raw": "{ \"is_active\": false }",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "DELETE Delete a webhook endpoint",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks/{id}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Removes the endpoint."
          }
        },
        {
          "name": "POST Test a webhook endpoint",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks/{id}/test",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":id",
                "test"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Sends a signed `webhook.test` payload to the endpoint and reports the result. This does not record a delivery. Always responds 200."
          }
        }
      ]
    }
  ]
}