quipteams REST API
Programmatic access to quotes, assets, employees, device actions, kits, webhooks, and the shared product catalog.
Base URL
https://api.quipteams.comAuth
Bearer token via Authorization header
Format
JSON responses, cursor pagination
Authentication
All requests require a Bearer token. Create an API key from your company settings.
curl "https://api.quipteams.com/api/v1/quotes" \
-H "Authorization: Bearer qk_live_a1b2c3d4e5f6..."Key format
qk_live_a1b2c3d4e5f6... # Production
qk_test_a1b2c3d4e5f6... # TestRate limiting
Every API key has a per-minute request budget. These headers are included in every response.
| Header | Description |
|---|---|
X-RateLimit-Limit | Max requests allowed in the current window |
X-RateLimit-Remaining | Requests left in the current window |
X-RateLimit-Reset | Unix timestamp (ms) when the window resets |
Retry-After | Seconds to wait before retrying (only on 429) |
Pagination
List endpoints use cursor-based pagination. Pass the cursor from the previous response to get the next page.
// First page
const res = await fetch("https://api.quipteams.com/api/v1/quotes?limit=10", {
headers: { Authorization: "Bearer YOUR_API_KEY" },
}).then((r) => r.json());
// Next page
const nextPage = await fetch(
`https://api.quipteams.com/api/v1/quotes?limit=10&cursor=${res.meta.next_cursor}`,
{ headers: { Authorization: "Bearer YOUR_API_KEY" } },
).then((r) => r.json());Errors
All errors return a consistent JSON structure with a code, message, and optional details.
{
"error": {
"code": "UNAUTHORIZED",
"message": "Missing or invalid Authorization header",
"details": null
}
}| Code | Status | Description |
|---|---|---|
UNAUTHORIZED | 401 | Missing, invalid, expired, or revoked API key. |
FORBIDDEN | 403 | Valid API key but lacks the required scope, or API access is disabled for the company. |
NOT_FOUND | 404 | The requested resource does not exist, or it belongs to a different company. |
VALIDATION_ERROR | 400 | Invalid query parameters. The details field may contain specifics. |
CONFLICT | 409 | The request conflicts with current state (e.g. device already has an active action). |
RATE_LIMITED | 429 | Too many requests. Check the Retry-After header and X-RateLimit-* headers. |
INTERNAL_ERROR | 500 | Unexpected server error. Contact support if this persists. |
Quotes
5 endpointsquotes:readManage hardware procurement quotes. Quotes contain items, recipients, and alternatives.
/api/v1/quotesList quotes
Returns a paginated list of quotes for the authenticated company. Supports filtering by status, country, and date range.
/api/v1/quotes/:idGet quote details
Returns full details for a single quote including all items, recipients, and alternatives.
/api/v1/quotesCreate a quote
Creates a new hardware procurement quote with items and recipients. Triggers background processing (email notifications and Asana task creation). Returns 202 with the created quote details. Each item uses one of two modes: catalog product (product_id) or kit bundle (kit_id). See the parameter groups below.
/api/v1/quotes/:id/items/:itemIdUpdate a quote item
Accept or reject a quote item with optional alternative selection and recipient updates. If alternative_id is provided, the action applies to that specific alternative (must belong to the item). On accept, you can pass updated recipients to replace existing ones.
/api/v1/quotes/:id/items/:itemId/actionAccept or reject
Simplified accept/reject endpoint. Pass any item or alternative UUID as itemId — the API auto-detects which table it belongs to and applies the correct cascading logic. No alternative_id parameter needed. On accept: pending alternatives are rejected (if itemId is an item), or the original item + other alternatives are rejected (if itemId is an alternative). Recipients and quote status are updated automatically. Triggers acceptance email and Tecspal order on accept.
Assets
1 endpointassets:readQuery the company's hardware asset inventory (holding assets).
Device Actions
4 endpointsdevice_actions:readTrack device lifecycle actions such as retrievals, transfers, wipes, and deployments.
/api/v1/device-actionsList device actions
Returns a paginated list of device actions for the authenticated company. Use include_asset=true to embed the full holding asset data for each device (replaces the removed GET /assets/:id endpoint).
/api/v1/device-actions/:idGet device action details
Returns full details for a device action including comments, notes, and status history. Use include_asset=true to embed the full holding asset data.
/api/v1/device-actionsCreate a device action
Creates a new device action for a device in your inventory. Only the serial_number is needed — device details (model, type, country) are auto-populated from your holding assets. Use GET /api/v1/assets?search=SERIAL to verify a device is in inventory first. Validates for conflicts with active actions on the same serial number.
/api/v1/device-actions/externalCreate external device action
Creates a device action for a device that is NOT in your inventory. Unlike the standard create endpoint, you must provide full device details (model, type, country) in the request body. If a device with the same serial number already exists in your inventory, the request will fail — use the standard POST /api/v1/device-actions instead.
Devices
1 endpointassets:writeAdd devices to your company's inventory (holding assets). Once added, you can create device actions using the serial number via POST /api/v1/device-actions.
Products & Kits
4 endpointsBrowse the global product catalog and reusable kit templates used when creating quotes.
/api/v1/productsList products
Returns the product catalog with optional filtering. Products are global reference data, not scoped to a specific company. All filters (product_type, brand, cpu, ram, storage, etc.) are case-insensitive. Use spec filters to find products by configuration — only products with matching configurations are returned. The response meta includes available_filters with all valid values so you can discover options in one call.
/api/v1/products/:idGet product detail
Returns a single product with all active configurations. Use the product id and configuration id when creating a quote.
/api/v1/kitsList kits
Returns a paginated list of kits for the authenticated company. Supports filtering by name, tag, and region.
/api/v1/kits/:idGet kit details
Returns full details for a single kit including all device specifications.
Webhooks
6 endpointswebhooks:manageSubscribe to real-time event notifications via HTTP callbacks. When events occur (tracking added, deliveries, status changes), quipteams sends a signed POST request to your endpoint.
/api/v1/webhooksList webhook endpoints
Returns all webhook endpoints configured for the authenticated company.
/api/v1/webhooksCreate webhook endpoint
Register a new webhook endpoint. The signing secret is returned once on creation -- save it securely. Max 10 endpoints per company.
/api/v1/webhooks/:idGet webhook details
Returns a webhook endpoint with its recent delivery history (last 20 deliveries).
/api/v1/webhooks/:idUpdate webhook endpoint
Update the URL, subscribed events, description, or active status of a webhook endpoint.
/api/v1/webhooks/:idDelete webhook endpoint
Permanently delete a webhook endpoint and all its delivery history.
/api/v1/webhooks/:id/testTest webhook endpoint
Send a test event to verify the endpoint is reachable and correctly verifying signatures. Returns the response status and latency.
Employees
2 endpointsemployees:readQuery employee records synced from your HRIS. Employees are read-only via the API.