{
	"info": {
		"name": "quipteams API v1",
		"description": "Hardware procurement & asset management API.\n\nAll endpoints require a Bearer token via the `Authorization` header.\nBase URL: `https://api.quipteams.com`\n\nPagination is cursor-based — use `cursor` from `meta.next_cursor`.",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
	},
	"auth": {
		"type": "bearer",
		"bearer": [
			{
				"key": "token",
				"value": "{{api_key}}",
				"type": "string"
			}
		]
	},
	"variable": [
		{
			"key": "base_url",
			"value": "https://api.quipteams.com",
			"type": "string"
		},
		{
			"key": "api_key",
			"value": "YOUR_API_KEY",
			"type": "string"
		}
	],
	"item": [
		{
			"name": "Quotes",
			"description": "Manage hardware procurement quotes. Quotes contain items, recipients, and alternatives.\n\nScopes: `quotes:read`, `quotes:write`",
			"item": [
				{
					"name": "List quotes",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/api/v1/quotes?status=&country=&created_after=&created_before=&sort=-created_at&limit=25&cursor=",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "quotes"],
							"query": [
								{ "key": "status", "value": "", "description": "Filter by quote status (e.g. pending, in_progress, delivered, completed)" },
								{ "key": "country", "value": "", "description": "Filter by country (partial match)" },
								{ "key": "created_after", "value": "", "description": "ISO 8601 — only quotes created after this date" },
								{ "key": "created_before", "value": "", "description": "ISO 8601 — only quotes created before this date" },
								{ "key": "sort", "value": "-created_at", "description": "Sort field. Prefix with - for descending. Options: created_at, -created_at, updated_at, -updated_at" },
								{ "key": "limit", "value": "25", "description": "Items per page, 1-100 (default: 25)" },
								{ "key": "cursor", "value": "", "description": "Pagination cursor from a previous response" }
							]
						},
						"description": "Returns a paginated list of quotes for the authenticated company. Supports filtering by status, country, and date range."
					}
				},
				{
					"name": "Get quote details",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/api/v1/quotes/:id",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "quotes", ":id"],
							"variable": [
								{ "key": "id", "value": "", "description": "The quote order_id (e.g. \"1773018508225\")" }
							]
						},
						"description": "Returns full details for a single quote including all items, recipients, and alternatives."
					}
				},
				{
					"name": "Create a quote",
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Content-Type", "value": "application/json" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"requester_email\": \"jane@acme.com\",\n  \"requester_name\": \"Jane Smith\",\n  \"po_number\": \"PO-9981\",\n  \"notification_emails\": [\"purchasing@acme.com\"],\n  \"items\": [\n    {\n      \"product_id\": \"8f3d8998-6a80-4612-bda3-7f14af50c686\",\n      \"configuration_id\": \"d748b47f-b4de-4a02-8fc4-1d815923392c\",\n      \"quantity\": 1,\n      \"comments\": \"Need US keyboard layout\",\n      \"recipients\": [\n        {\n          \"name\": \"John Doe\",\n          \"email\": \"john@acme.com\",\n          \"country\": \"United States\",\n          \"phone_number\": \"+1-555-0100\",\n          \"address\": \"123 Main St, NYC\"\n        }\n      ]\n    }\n  ]\n}",
							"options": { "raw": { "language": "json" } }
						},
						"url": {
							"raw": "{{base_url}}/api/v1/quotes",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "quotes"]
						},
						"description": "Creates a new hardware procurement quote. Each item uses one of two modes: catalog product (product_id) or kit bundle (kit_id). Returns 202."
					}
				},
				{
					"name": "Create a quote (kit mode)",
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Content-Type", "value": "application/json" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"requester_email\": \"jane@acme.com\",\n  \"requester_name\": \"Jane Smith\",\n  \"items\": [\n    {\n      \"kit_id\": \"kit-uuid-001\",\n      \"quantity\": 1,\n      \"comments\": \"New hire starting April 1st\",\n      \"recipients\": [\n        {\n          \"name\": \"John Doe\",\n          \"email\": \"john@acme.com\",\n          \"country\": \"United States\",\n          \"address\": \"123 Main St, NYC\"\n        }\n      ]\n    }\n  ]\n}",
							"options": { "raw": { "language": "json" } }
						},
						"url": {
							"raw": "{{base_url}}/api/v1/quotes",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "quotes"]
						},
						"description": "Creates a new quote using a kit bundle. The kit_id expands into one quote item per device in the kit."
					}
				},
				{
					"name": "Accept or reject item",
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Content-Type", "value": "application/json" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"action\": \"accept\"\n}",
							"options": { "raw": { "language": "json" } }
						},
						"url": {
							"raw": "{{base_url}}/api/v1/quotes/:id/items/:itemId/action",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "quotes", ":id", "items", ":itemId", "action"],
							"variable": [
								{ "key": "id", "value": "", "description": "The quote order_id" },
								{ "key": "itemId", "value": "", "description": "UUID of an item or alternative" }
							]
						},
						"description": "Unified accept/reject endpoint. Pass any item or alternative UUID as itemId — the API auto-detects which table it belongs to. Action must be \"accept\" or \"reject\"."
					}
				},
				{
					"name": "Update a quote item",
					"request": {
						"method": "PATCH",
						"header": [
							{ "key": "Content-Type", "value": "application/json" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"action\": \"accept\",\n  \"alternative_id\": \"alt-uuid-001\",\n  \"recipients\": [\n    {\n      \"name\": \"John Doe\",\n      \"email\": \"john@acme.com\",\n      \"country\": \"United States\",\n      \"phone_number\": \"+1-555-0100\",\n      \"address\": \"123 Main St, NYC\"\n    }\n  ]\n}",
							"options": { "raw": { "language": "json" } }
						},
						"url": {
							"raw": "{{base_url}}/api/v1/quotes/:id/items/:itemId",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "quotes", ":id", "items", ":itemId"],
							"variable": [
								{ "key": "id", "value": "", "description": "The quote order_id" },
								{ "key": "itemId", "value": "", "description": "UUID of the quote item" }
							]
						},
						"description": "Accept or reject a quote item with optional alternative selection and recipient updates. Requires quotes:write scope."
					}
				}
			]
		},
		{
			"name": "Assets",
			"description": "Query the company's hardware asset inventory (holding assets).\n\nScope: `assets:read`",
			"item": [
				{
					"name": "List assets",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/api/v1/assets?serial_number=&item_id=&country=&device_type=&search=&sort=-created_at&limit=25&cursor=",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "assets"],
							"query": [
								{ "key": "serial_number", "value": "", "description": "Exact match on serial number" },
								{ "key": "item_id", "value": "", "description": "Exact match on asset UUID" },
								{ "key": "country", "value": "", "description": "Filter by country (case-insensitive)" },
								{ "key": "device_type", "value": "", "description": "Filter by device type: Laptop, Monitor, Mouse, Keyboard, Headphones, Webcam, Accessory" },
								{ "key": "search", "value": "", "description": "Search across serial number, description, and employee" },
								{ "key": "sort", "value": "-created_at", "description": "Sort field. Options: created_at, -created_at, updated_at, -updated_at" },
								{ "key": "limit", "value": "25", "description": "Items per page, 1-100 (default: 25)" },
								{ "key": "cursor", "value": "", "description": "Pagination cursor from a previous response" }
							]
						},
						"description": "Returns a paginated list of holding assets for the authenticated company."
					}
				}
			]
		},
		{
			"name": "Device Actions",
			"description": "Track device lifecycle actions such as retrievals, transfers, wipes, and deployments.\n\nScopes: `device_actions:read`, `device_actions:write`",
			"item": [
				{
					"name": "List device actions",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/api/v1/device-actions?status=&action_type=&serial_number=&include_asset=false&created_after=&created_before=&sort=-created_at&limit=25&cursor=",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "device-actions"],
							"query": [
								{ "key": "status", "value": "", "description": "Filter by status (e.g. In Progress, Completed)" },
								{ "key": "action_type", "value": "", "description": "Filter by type: Store, Assign, Reassign, Sell, Support" },
								{ "key": "serial_number", "value": "", "description": "Filter by device serial number (case-insensitive, partial match)" },
								{ "key": "include_asset", "value": "false", "description": "When true, embeds the full holding asset object for each device action" },
								{ "key": "created_after", "value": "", "description": "ISO 8601 — only actions created after this date" },
								{ "key": "created_before", "value": "", "description": "ISO 8601 — only actions created before this date" },
								{ "key": "sort", "value": "-created_at", "description": "Sort field. Options: created_at, -created_at, updated_at, -updated_at" },
								{ "key": "limit", "value": "25", "description": "Items per page, 1-100 (default: 25)" },
								{ "key": "cursor", "value": "", "description": "Pagination cursor from a previous response" }
							]
						},
						"description": "Returns a paginated list of device actions. Use include_asset=true to embed the full holding asset data for each device."
					}
				},
				{
					"name": "Get device action details",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/api/v1/device-actions/:id?include_asset=false",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "device-actions", ":id"],
							"query": [
								{ "key": "include_asset", "value": "false", "description": "When true, embeds the full holding asset object" }
							],
							"variable": [
								{ "key": "id", "value": "", "description": "Device action UUID or asset_order_id (e.g. \"DA-2026-0015\")" }
							]
						},
						"description": "Returns full details for a device action including comments, notes, and status history."
					}
				},
				{
					"name": "Create a device action",
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Content-Type", "value": "application/json" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"action_type\": \"Store\",\n  \"serial_number\": \"C02X9876WXYZ\",\n  \"current_user\": {\n    \"name\": \"John Doe\",\n    \"email\": \"john@acme.com\",\n    \"country\": \"United States\",\n    \"address\": \"123 Main St\",\n    \"phone\": \"+1-555-0100\"\n  },\n  \"wipe\": true,\n  \"notes\": \"Employee leaving March 15th\",\n  \"notification_emails\": [\"it@acme.com\"]\n}",
							"options": { "raw": { "language": "json" } }
						},
						"url": {
							"raw": "{{base_url}}/api/v1/device-actions",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "device-actions"]
						},
						"description": "Creates a new device action. Only serial_number is needed — device details are auto-populated from inventory. Action types: Store, Assign, Reassign, Sell, Support."
					}
				},
				{
					"name": "Create external device action",
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Content-Type", "value": "application/json" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"action_type\": \"Store\",\n  \"serial_number\": \"EXT-SN-99999\",\n  \"model\": \"ThinkPad X1 Carbon Gen 11\",\n  \"type\": \"Laptop\",\n  \"country\": \"Germany\",\n  \"current_user\": {\n    \"name\": \"Hans Mueller\",\n    \"email\": \"hans@acme.com\",\n    \"country\": \"Germany\",\n    \"address\": \"Hauptstr. 10, Berlin\",\n    \"phone\": \"+49-30-12345678\"\n  },\n  \"wipe\": true,\n  \"notes\": \"External contractor device return\",\n  \"notification_emails\": [\"it@acme.com\"]\n}",
							"options": { "raw": { "language": "json" } }
						},
						"url": {
							"raw": "{{base_url}}/api/v1/device-actions/external",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "device-actions", "external"]
						},
						"description": "Creates a device action for a device NOT in your inventory. Full device details must be provided. Requires device_actions:write scope."
					}
				}
			]
		},
		{
			"name": "Devices",
			"description": "Add devices to your company's inventory (holding assets).\n\nScope: `assets:write`",
			"item": [
				{
					"name": "Add devices to inventory",
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Content-Type", "value": "application/json" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"serial_number\": \"EXT-SN-12345\",\n  \"device_type\": \"Laptop\",\n  \"country\": \"Germany\",\n  \"description\": \"ThinkPad X1 Carbon Gen 11\",\n  \"employee\": \"Hans Mueller\",\n  \"condition\": \"Good\",\n  \"cost\": 1200.00\n}",
							"options": { "raw": { "language": "json" } }
						},
						"url": {
							"raw": "{{base_url}}/api/v1/devices",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "devices"]
						},
						"description": "Adds one or more devices to your company's holding assets. Send a single device object or an array. If employee is set, device is assigned; if null, it is in storage."
					}
				}
			]
		},
		{
			"name": "Products & Kits",
			"description": "Browse the global product catalog and reusable kit templates used when creating quotes.\n\nScopes: `products:read`, `kits:read`",
			"item": [
				{
					"name": "List products",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/api/v1/products?product_type=&brand=&search=&cpu=&ram=&storage=&screen_size=&resolution=&connection_type=&include_inactive=false",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "products"],
							"query": [
								{ "key": "product_type", "value": "", "description": "Filter by type: Laptop, Monitor, Mouse, Keyboard, Headphones, Webcam, Accessory" },
								{ "key": "brand", "value": "", "description": "Filter by brand, case-insensitive (e.g. Apple, Dell)" },
								{ "key": "search", "value": "", "description": "Search by brand or model name (case-insensitive)" },
								{ "key": "cpu", "value": "", "description": "Filter by processor. Comma-separated for OR matching (e.g. \"M4 Pro,M5\")" },
								{ "key": "ram", "value": "", "description": "Filter by RAM. Comma-separated for OR matching (e.g. \"16GB,32GB\")" },
								{ "key": "storage", "value": "", "description": "Filter by storage. Comma-separated for OR matching (e.g. \"512GB,1TB\")" },
								{ "key": "screen_size", "value": "", "description": "Filter by screen size. Comma-separated for OR matching (e.g. \"13,15\")" },
								{ "key": "resolution", "value": "", "description": "Filter by resolution. Comma-separated for OR matching (e.g. \"4K,5K\")" },
								{ "key": "connection_type", "value": "", "description": "Filter by connection type. Comma-separated for OR matching (e.g. \"Wireless,Bluetooth\")" },
								{ "key": "include_inactive", "value": "false", "description": "Set to true to include inactive products" }
							]
						},
						"description": "Returns the product catalog with optional filtering. Spec filters support comma-separated values for OR matching within a filter, AND across different filters. Response meta includes available_filters."
					}
				},
				{
					"name": "Get product detail",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/api/v1/products/:id",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "products", ":id"],
							"variable": [
								{ "key": "id", "value": "", "description": "Product UUID" }
							]
						},
						"description": "Returns a single product with all active configurations. Use the product id and configuration id when creating a quote."
					}
				},
				{
					"name": "List kits",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/api/v1/kits?search=&tag=&region=&sort=-created_at&limit=25&cursor=",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "kits"],
							"query": [
								{ "key": "search", "value": "", "description": "Search kits by name (case-insensitive)" },
								{ "key": "tag", "value": "", "description": "Filter by tag" },
								{ "key": "region", "value": "", "description": "Filter by region (exact match)" },
								{ "key": "sort", "value": "-created_at", "description": "Sort field. Options: created_at, -created_at, updated_at, -updated_at, name, -name" },
								{ "key": "limit", "value": "25", "description": "Items per page, 1-100 (default: 25)" },
								{ "key": "cursor", "value": "", "description": "Pagination cursor from a previous response" }
							]
						},
						"description": "Returns a paginated list of kits for the authenticated company."
					}
				},
				{
					"name": "Get kit details",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/api/v1/kits/:id",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "kits", ":id"],
							"variable": [
								{ "key": "id", "value": "", "description": "Kit UUID" }
							]
						},
						"description": "Returns full details for a single kit including all device specifications."
					}
				}
			]
		},
		{
			"name": "Webhooks",
			"description": "Subscribe to real-time event notifications via HTTP callbacks.\n\nScope: `webhooks:manage`",
			"item": [
				{
					"name": "List webhook endpoints",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/api/v1/webhooks",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "webhooks"]
						},
						"description": "Returns all webhook endpoints configured for the authenticated company."
					}
				},
				{
					"name": "Get webhook details",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/api/v1/webhooks/:id",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "webhooks", ":id"],
							"variable": [
								{ "key": "id", "value": "", "description": "Webhook endpoint UUID" }
							]
						},
						"description": "Returns a webhook endpoint with its recent delivery history (last 20 deliveries)."
					}
				},
				{
					"name": "Create webhook endpoint",
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Content-Type", "value": "application/json" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"url\": \"https://your-app.com/webhooks/quip\",\n  \"events\": [\"quote.*\", \"logistics.*\"],\n  \"description\": \"Production handler\"\n}",
							"options": { "raw": { "language": "json" } }
						},
						"url": {
							"raw": "{{base_url}}/api/v1/webhooks",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "webhooks"]
						},
						"description": "Register a new webhook endpoint. The signing secret is returned once on creation — save it securely. Max 10 endpoints per company.\n\nWildcards: Use quote.* or logistics.* to subscribe to all events in a category.\n\nAvailable events: quote.pending, quote.delivered, quote.tracking_added, quote.action_required, quote.message, quote.status_changed, quote.scheduling_created, quote.alternative_offered, quote.price_updated, logistics.completed, logistics.tracking_added, logistics.action_required, logistics.message, logistics.status_changed"
					}
				},
				{
					"name": "Update webhook endpoint",
					"request": {
						"method": "PATCH",
						"header": [
							{ "key": "Content-Type", "value": "application/json" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"events\": [\"quote.*\", \"logistics.tracking_added\"],\n  \"is_active\": true\n}",
							"options": { "raw": { "language": "json" } }
						},
						"url": {
							"raw": "{{base_url}}/api/v1/webhooks/:id",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "webhooks", ":id"],
							"variable": [
								{ "key": "id", "value": "", "description": "Webhook endpoint UUID" }
							]
						},
						"description": "Update the URL, subscribed events, description, or active status of a webhook endpoint.\n\nWildcards: Use quote.* or logistics.* to subscribe to all events in a category.\n\nAvailable events: quote.pending, quote.delivered, quote.tracking_added, quote.action_required, quote.message, quote.status_changed, quote.scheduling_created, quote.alternative_offered, quote.price_updated, logistics.completed, logistics.tracking_added, logistics.action_required, logistics.message, logistics.status_changed"
					}
				},
				{
					"name": "Delete webhook endpoint",
					"request": {
						"method": "DELETE",
						"header": [],
						"url": {
							"raw": "{{base_url}}/api/v1/webhooks/:id",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "webhooks", ":id"],
							"variable": [
								{ "key": "id", "value": "", "description": "Webhook endpoint UUID" }
							]
						},
						"description": "Permanently delete a webhook endpoint and all its delivery history."
					}
				},
				{
					"name": "Test webhook endpoint",
					"request": {
						"method": "POST",
						"header": [],
						"url": {
							"raw": "{{base_url}}/api/v1/webhooks/:id/test",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "webhooks", ":id", "test"],
							"variable": [
								{ "key": "id", "value": "", "description": "Webhook endpoint UUID" }
							]
						},
						"description": "Send a test event to verify the endpoint is reachable and correctly verifying signatures."
					}
				}
			]
		},
		{
			"name": "Employees",
			"description": "Query employee records synced from your HRIS. Requires employees:read scope.",
			"item": [
				{
					"name": "List employees",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/api/v1/employees?status=&search=&limit=25&cursor=",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "employees"],
							"query": [
								{ "key": "status", "value": "", "description": "Filter by employee status" },
								{ "key": "search", "value": "", "description": "Search across employee name and email" },
								{ "key": "limit", "value": "25", "description": "Items per page, 1-100 (default: 25)" },
								{ "key": "cursor", "value": "", "description": "Pagination cursor from a previous response" }
							]
						},
						"description": "Returns a paginated list of employees for the authenticated company."
					}
				},
				{
					"name": "Get employee details",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/api/v1/employees/:id",
							"host": ["{{base_url}}"],
							"path": ["api", "v1", "employees", ":id"],
							"variable": [
								{ "key": "id", "value": "", "description": "Employee UUID" }
							]
						},
						"description": "Returns full details for a single employee including HRIS metadata."
					}
				}
			]
		}
	]
}