agentlyleads docs
Offerings API

GET /api/v1/products

Returns all products in the workspace, sorted by createdAt descending (newest first). Use optional query parameters to filter by SKU or category. Useful for verifying a sync or checking the current catalog state.

This endpoint lists offerings of every type (PRODUCT, SERVICE, SUBSCRIPTION, CONTRACT) — see Offerings & types.

Request

GET /api/v1/products HTTP/1.1
Host: agentlyleads.com
Authorization: Bearer alk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Query parameters

ParameterDescription
skuReturn only the product with this exact SKU
categoryReturn only products belonging to this category (matched by name)
limitOptional page size, 1–1000. When omitted, the full catalog is returned in one response
cursorThe nextCursor value from the previous page (only meaningful together with limit)

All parameters are optional and can be combined.

Filter by category:

GET /api/v1/products?category=Electronics HTTP/1.1
Authorization: Bearer alk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Look up a specific product by SKU:

GET /api/v1/products?sku=RTR-4G HTTP/1.1
Authorization: Bearer alk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Response — 200

{
  "products": [
    {
      "id": "cmq1abc2def3ghi4jkl5",
      "name": "4G Router",
      "type": "PRODUCT",
      "sku": "RTR-4G",
      "price": 199,
      "cost": 120,
      "currency": "USD",
      "unit": "each",
      "billingPeriod": null,
      "termMonths": null,
      "stockQty": 50,
      "reorderLevel": null,
      "description": null,
      "features": null,
      "active": true,
      "externalId": null,
      "category": "Electronics",
      "createdAt": "2025-06-01T12:00:00.000Z",
      "updatedAt": "2025-06-27T09:00:00.000Z"
    }
  ],
  "nextCursor": null
}

All Product object fields are returned. See the Product object reference for field descriptions.

price and cost are returned as JSON numbers (never strings).

Pagination

Pagination is opt-in on this endpoint: with no limit, the full catalog is returned and nextCursor is always null (the endpoint's original behaviour). When limit is set and more rows exist, nextCursor holds the ID of the last returned record — pass it back as cursor to fetch the next page.

On this page