Products API

Create, search, update, and deactivate reusable catalog items via the Corinthian 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 Corinthian 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.

curl "https://api.conduitt.io/products/search?q=web&limit=10" \
  -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.