Skip to main content

Products API

Create, search, update, and deactivate reusable catalog items via the Conduitt API.

Products represent reusable catalog entries for the services or goods you invoice repeatedly. Each product stores a default name, price, currency, optional SKU, optional billing unit, and optional tax rate that Conduitt can reuse when you build invoices.

The Product Object

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Web Development Package",
  "description": "Full-stack web development services",
  "sku": "WDP-001",
  "price": "1500.00",
  "currency": "USD",
  "unit": "hour",
  "taxRate": "8.50",
  "isActive": true,
  "usageCount": 12,
  "userId": "8c8398b5-0732-4f92-b04e-0dfd4af8c7de",
  "organizationId": "org_01abc",
  "createdAt": "2025-01-15T10:30:00.000Z",
  "updatedAt": "2025-01-15T10:30:00.000Z"
}

price and taxRate are returned as decimal strings so clients do not lose precision.

Common Units

UnitDescription
hourHourly rate
unitPer unit/item
projectFlat project fee
monthMonthly recurring
licensePer-seat or per-license billing

Create a Product

POST /products

Parameters

ParameterTypeRequiredDescription
namestringYesProduct name
descriptionstringNoDetailed description
skustring | nullNoInternal SKU or reference code
pricestringYesDecimal string price such as "1500.00"
currencystringNoThree-letter ISO currency code. Defaults to USD.
unitstringNoBilling unit (see above)
taxRatestring | nullNoDecimal percentage string such as "8.50"

Example Request

curl -X POST https://api.conduitt.io/products \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Web Development Package",
    "description": "Full-stack web development services",
    "sku": "WDP-001",
    "price": "1500.00",
    "currency": "USD",
    "unit": "hour",
    "taxRate": "8.50"
  }'

Response

{
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Web Development Package",
    "description": "Full-stack web development services",
    "sku": "WDP-001",
    "price": "1500.00",
    "currency": "USD",
    "unit": "hour",
    "taxRate": "8.50",
    "isActive": true,
    "usageCount": 0,
    "userId": "8c8398b5-0732-4f92-b04e-0dfd4af8c7de",
    "organizationId": "org_01abc",
    "createdAt": "2025-01-15T10:30:00.000Z",
    "updatedAt": "2025-01-15T10:30:00.000Z"
  }
}

Retrieve a Product

GET /products/:id
curl https://api.conduitt.io/products/550e8400-e29b-41d4-a716-446655440000 \
  -H "Authorization: Bearer YOUR_API_KEY"

List Products

GET /products

Query Parameters

ParameterTypeDescription
limitnumberResults per page (1-100, default 50)
offsetnumberNumber of products to skip (default 0)
qstringCase-insensitive partial match on product name
includeInactivebooleanSet to true to include inactive products

Example

curl "https://api.conduitt.io/products?limit=20&offset=0&q=web&includeInactive=false" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "data": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "name": "Web Development Package",
      "price": "1500.00",
      "unit": "hour",
      "currency": "USD",
      "isActive": true
    },
    {
      "id": "0f8fad5b-d9cb-469f-a165-70867728950e",
      "name": "SEO Audit",
      "price": "2500.00",
      "unit": "project",
      "currency": "USD",
      "isActive": true
    }
  ],
  "meta": {
    "total": 2,
    "limit": 20,
    "offset": 0
  }
}

Search Products

GET /products/search

Use the dedicated search endpoint when you want name, description, or SKU matching with active products only.

Query Parameters

ParameterTypeDescription
qstringRequired search text for name, description, SKU, or category matching
limitnumberResults per page (1-100, default 20)
offsetnumberNumber of search results to skip (default 0)
curl "https://api.conduitt.io/products/search?q=web&limit=10&offset=0" \
  -H "Authorization: Bearer YOUR_API_KEY"

Update a Product

PATCH /products/:id

Only fields you send are updated. Existing invoice line items keep their original copied values even if you later change the product defaults.

curl -X PATCH https://api.conduitt.io/products/550e8400-e29b-41d4-a716-446655440000 \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "price": "1750.00",
    "description": "Full-stack web development and consulting",
    "isActive": false
  }'

Setting isActive to false hides the product from search and product pickers without deleting it.

Delete a Product

DELETE /products/:id

Deleting a product permanently removes it from the catalog. Existing invoice line items that already copied the product data are not affected.

curl -X DELETE https://api.conduitt.io/products/550e8400-e29b-41d4-a716-446655440000 \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "id": "550e8400-e29b-41d4-a716-446655440000"
}

Delete is permanent. If you want to keep historical catalog data while removing the product from future selection, update it with isActive: false instead.

We use cookies to improve your experience, analyze traffic, and personalize content.