> ## Documentation Index
> Fetch the complete documentation index at: https://learn.nexudus.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Search CoworkerProducts

> Search and list CoworkerProduct records with filtering, sorting, and pagination.

A **CoworkerProduct** is a record of a product sold to a customer as a one-off or on a recurrent basis.

`RepeatCycle` can only be set to `PricePlan` if the customer has a contract set as their main contract. In general, it is best to use `ContractProduct` instead of adding CoworkerProducts repeating based on `PricePlan`.

`InvoiceThisCoworker` indicates this customer should be invoiced for this product instead of the paying member of their team.

`ActivateNow` releases any benefits (credits or passes) even before the product is invoiced and paid.

`ProductApplyProRating` indicates the sold product is configured to prorate the price of this sale based on the prorating rules of the main contract of the customer: it adjusts the price based on the number of days left between the current date and the next invoice date (`RenewalDate`) of the customer's main contract.

Properties ending in `UniqueId` link the sale to the originating record using its GUID `UniqueId` property (not the integer ID). Only one of these will be populated per record:

| UniqueId property          | Source entity    |
| -------------------------- | ---------------- |
| `CoworkerContractUniqueId` | CoworkerContract |
| `ContractDepositUniqueId`  | ContractDeposit  |
| `ContractProductUniqueId`  | ContractProduct  |
| `BookingUniqueId`          | Booking          |
| `CoworkerDeliveryUniqueId` | CoworkerDelivery |

## Authentication

<Note>
  This endpoint requires OAuth2 authentication. Include a valid bearer token in the `Authorization` header.
  The authenticated user must be a full unrestricted administrator or have the **`CoworkerProduct-List`** role.
</Note>

## Enums

<Accordion title="eRecurrentChargePattern — RepeatCycle values">
  | Value | Name           |
  | ----- | -------------- |
  | 1     | PricePlan      |
  | 2     | Day            |
  | 3     | Week           |
  | 4     | Month          |
  | 5     | Year           |
  | 6     | LastDayOfMonth |
</Accordion>

## Query Parameters

### Pagination & Sorting

<ParamField query="page" type="integer" default="1">
  The page number to retrieve.
</ParamField>

<ParamField query="size" type="integer" default="25">
  The number of records per page.
</ParamField>

<ParamField query="orderBy" type="string">
  The property name to sort results by (e.g. `Name`, `CreatedOn`).
</ParamField>

<ParamField query="dir" type="integer">
  Sort direction. `0` for ascending, `1` for descending.
</ParamField>

### Filters

<ParamField query="CoworkerProduct_Coworker" type="integer">
  Filter by Coworker Id.
</ParamField>

<ParamField query="CoworkerProduct_Coworker_CoworkerType" type="string">
  Filter by coworker type.
</ParamField>

<ParamField query="CoworkerProduct_Coworker_FullName" type="string">
  Filter by coworker full name.
</ParamField>

<ParamField query="CoworkerProduct_Coworker_CompanyName" type="string">
  Filter by coworker company name.
</ParamField>

<ParamField query="CoworkerProduct_Coworker_BillingName" type="string">
  Filter by coworker billing name.
</ParamField>

<ParamField query="CoworkerProduct_Coworker_Email" type="string">
  Filter by coworker email.
</ParamField>

<ParamField query="CoworkerProduct_Business" type="integer">
  Filter by Business Id.
</ParamField>

<ParamField query="CoworkerProduct_Product" type="integer">
  Filter by Product Id.
</ParamField>

<ParamField query="CoworkerProduct_Product_Name" type="string">
  Filter by product name.
</ParamField>

<ParamField query="CoworkerProduct_Product_Price" type="number">
  Filter by product price.
</ParamField>

<ParamField query="CoworkerProduct_Product_ApplyProRating" type="string">
  Filter by whether the sold product is configured to prorate the price of this sale based on the prorating rules of the customer's main contract, adjusting the price based on the number of days left until the next invoice date (RenewalDate).
</ParamField>

<ParamField query="CoworkerProduct_Product_Currency_Code" type="string">
  Filter by product currency code.
</ParamField>

<ParamField query="CoworkerProduct_Notes" type="string">
  Filter by notes.
</ParamField>

<ParamField query="CoworkerProduct_PurchaseOrder" type="string">
  Filter by purchase order.
</ParamField>

<ParamField query="CoworkerProduct_OrderNumber" type="string">
  Filter by order number.
</ParamField>

<ParamField query="CoworkerProduct_Activated" type="boolean">
  Filter by whether the product is activated.
</ParamField>

<ParamField query="CoworkerProduct_ActivateNow" type="boolean">
  Filter by activate immediately, releasing any benefits (credits or passes) even before the product is invoiced and paid.
</ParamField>

<ParamField query="CoworkerProduct_InvoiceThisCoworker" type="boolean">
  Filter by invoice this customer for this product instead of the paying member of their team.
</ParamField>

<ParamField query="CoworkerProduct_Price" type="number">
  Filter by price override.
</ParamField>

<ParamField query="CoworkerProduct_Quantity" type="integer">
  Filter by quantity.
</ParamField>

<ParamField query="CoworkerProduct_RegularCharge" type="boolean">
  Filter by whether this is a regular charge.
</ParamField>

<ParamField query="CoworkerProduct_RepeatCycle" type="integer">
  Filter by repeat cycle pattern. PricePlan can only be used if the customer has a main contract; prefer ContractProduct instead of CoworkerProducts repeating on PricePlan.
</ParamField>

<ParamField query="CoworkerProduct_RepeatUnit" type="integer">
  Filter by number of repeat units.
</ParamField>

<ParamField query="CoworkerProduct_InvoiceOn" type="string">
  Filter by invoice on date.
</ParamField>

<ParamField query="CoworkerProduct_RepeatFrom" type="string">
  Filter by repeat from date.
</ParamField>

<ParamField query="CoworkerProduct_RepeatUntil" type="string">
  Filter by repeat until date.
</ParamField>

<ParamField query="CoworkerProduct_SaleDate" type="string">
  Filter by sale date.
</ParamField>

<ParamField query="CoworkerProduct_DueDate" type="string">
  Filter by due date.
</ParamField>

<ParamField query="CoworkerProduct_Invoiced" type="boolean">
  Filter by whether it has been invoiced.
</ParamField>

<ParamField query="CoworkerProduct_InvoicedOn" type="string">
  Filter by date invoiced.
</ParamField>

<ParamField query="CoworkerProduct_FromTariff" type="boolean">
  Filter by whether added from tariff.
</ParamField>

<ParamField query="CoworkerProduct_BookingUniqueId" type="string">
  Filter by links to the Booking that generated this sale (GUID UniqueId, not integer ID).
</ParamField>

<ParamField query="CoworkerProduct_MrmReminded" type="boolean">
  Filter by Mrm Reminded.
</ParamField>

<ParamField query="CoworkerProduct_ApplyProRating" type="boolean">
  Filter by apply pro-rating.
</ParamField>

<ParamField query="CoworkerProduct_CoworkerContractUniqueId" type="string">
  Filter by links to the CoworkerContract that generated this sale (GUID UniqueId, not integer ID).
</ParamField>

<ParamField query="CoworkerProduct_ContractDepositUniqueId" type="string">
  Filter by links to the ContractDeposit that generated this sale (GUID UniqueId, not integer ID).
</ParamField>

<ParamField query="CoworkerProduct_ContractProductUniqueId" type="string">
  Filter by links to the ContractProduct that generated this sale (GUID UniqueId, not integer ID).
</ParamField>

<ParamField query="CoworkerProduct_CoworkerDeliveryUniqueId" type="string">
  Filter by links to the CoworkerDelivery that generated this sale (GUID UniqueId, not integer ID).
</ParamField>

<ParamField query="CoworkerProduct_ProposalUniqueId" type="string">
  Filter by Proposal Unique Id.
</ParamField>

<ParamField query="CoworkerProduct_CoworkerInvoiceId" type="integer">
  Filter by coworker invoice ID.
</ParamField>

<ParamField query="CoworkerProduct_CoworkerInvoiceNumber" type="string">
  Filter by coworker invoice number.
</ParamField>

<ParamField query="CoworkerProduct_CoworkerInvoicePaid" type="boolean">
  Filter by whether coworker invoice is paid.
</ParamField>

<ParamField query="CoworkerProduct_TeamsAtTheTimeOfPurchase" type="string">
  Filter by teams at the time of purchase.
</ParamField>

<ParamField query="CoworkerProduct_CreditAmount" type="number">
  Filter by credit amount.
</ParamField>

<ParamField query="CoworkerProduct_DiscountAmount" type="number">
  Filter by discount amount.
</ParamField>

### Range Filters

<ParamField query="from_CoworkerProduct_ProductPrice" type="number">
  Filter by product price greater than or equal to this value.
</ParamField>

<ParamField query="to_CoworkerProduct_ProductPrice" type="number">
  Filter by product price less than or equal to this value.
</ParamField>

<ParamField query="from_CoworkerProduct_Price" type="number">
  Filter by price override greater than or equal to this value.
</ParamField>

<ParamField query="to_CoworkerProduct_Price" type="number">
  Filter by price override less than or equal to this value.
</ParamField>

<ParamField query="from_CoworkerProduct_Quantity" type="integer">
  Filter by quantity greater than or equal to this value.
</ParamField>

<ParamField query="to_CoworkerProduct_Quantity" type="integer">
  Filter by quantity less than or equal to this value.
</ParamField>

<ParamField query="from_CoworkerProduct_RepeatUnit" type="integer">
  Filter by number of repeat units greater than or equal to this value.
</ParamField>

<ParamField query="to_CoworkerProduct_RepeatUnit" type="integer">
  Filter by number of repeat units less than or equal to this value.
</ParamField>

<ParamField query="from_CoworkerProduct_InvoiceOn" type="string">
  Filter by invoice on date greater than or equal to this value. Format: `YYYY-MM-DDTHH:mm`.
</ParamField>

<ParamField query="to_CoworkerProduct_InvoiceOn" type="string">
  Filter by invoice on date less than or equal to this value. Format: `YYYY-MM-DDTHH:mm`.
</ParamField>

<ParamField query="from_CoworkerProduct_RepeatFrom" type="string">
  Filter by repeat from date greater than or equal to this value. Format: `YYYY-MM-DDTHH:mm`.
</ParamField>

<ParamField query="to_CoworkerProduct_RepeatFrom" type="string">
  Filter by repeat from date less than or equal to this value. Format: `YYYY-MM-DDTHH:mm`.
</ParamField>

<ParamField query="from_CoworkerProduct_RepeatUntil" type="string">
  Filter by repeat until date greater than or equal to this value. Format: `YYYY-MM-DDTHH:mm`.
</ParamField>

<ParamField query="to_CoworkerProduct_RepeatUntil" type="string">
  Filter by repeat until date less than or equal to this value. Format: `YYYY-MM-DDTHH:mm`.
</ParamField>

<ParamField query="from_CoworkerProduct_SaleDate" type="string">
  Filter by sale date greater than or equal to this value. Format: `YYYY-MM-DDTHH:mm`.
</ParamField>

<ParamField query="to_CoworkerProduct_SaleDate" type="string">
  Filter by sale date less than or equal to this value. Format: `YYYY-MM-DDTHH:mm`.
</ParamField>

<ParamField query="from_CoworkerProduct_DueDate" type="string">
  Filter by due date greater than or equal to this value. Format: `YYYY-MM-DDTHH:mm`.
</ParamField>

<ParamField query="to_CoworkerProduct_DueDate" type="string">
  Filter by due date less than or equal to this value. Format: `YYYY-MM-DDTHH:mm`.
</ParamField>

<ParamField query="from_CoworkerProduct_InvoicedOn" type="string">
  Filter by date invoiced greater than or equal to this value. Format: `YYYY-MM-DDTHH:mm`.
</ParamField>

<ParamField query="to_CoworkerProduct_InvoicedOn" type="string">
  Filter by date invoiced less than or equal to this value. Format: `YYYY-MM-DDTHH:mm`.
</ParamField>

<ParamField query="from_CoworkerProduct_CoworkerInvoiceId" type="integer">
  Filter by coworker invoice ID greater than or equal to this value.
</ParamField>

<ParamField query="to_CoworkerProduct_CoworkerInvoiceId" type="integer">
  Filter by coworker invoice ID less than or equal to this value.
</ParamField>

<ParamField query="from_CoworkerProduct_CreditAmount" type="number">
  Filter by credit amount greater than or equal to this value.
</ParamField>

<ParamField query="to_CoworkerProduct_CreditAmount" type="number">
  Filter by credit amount less than or equal to this value.
</ParamField>

<ParamField query="from_CoworkerProduct_DiscountAmount" type="number">
  Filter by discount amount greater than or equal to this value.
</ParamField>

<ParamField query="to_CoworkerProduct_DiscountAmount" type="number">
  Filter by discount amount less than or equal to this value.
</ParamField>

<ParamField query="from_CoworkerProduct_CreatedOn" type="string">
  Filter records created on or after this date. Format: `YYYY-MM-DDTHH:mm`.
</ParamField>

<ParamField query="to_CoworkerProduct_CreatedOn" type="string">
  Filter records created on or before this date. Format: `YYYY-MM-DDTHH:mm`.
</ParamField>

<ParamField query="from_CoworkerProduct_UpdatedOn" type="string">
  Filter records updated on or after this date. Format: `YYYY-MM-DDTHH:mm`.
</ParamField>

<ParamField query="to_CoworkerProduct_UpdatedOn" type="string">
  Filter records updated on or before this date. Format: `YYYY-MM-DDTHH:mm`.
</ParamField>

## Code Examples

### Simple listing

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET \
    "https://spaces.nexudus.com/api/billing/coworkerproducts?page=1&size=15&orderBy=CreatedOn&dir=0" \
    -H "Authorization: Bearer YOUR_TOKEN"
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch(
    'https://spaces.nexudus.com/api/billing/coworkerproducts?' + new URLSearchParams({
      page: 1,
      size: 15,
      orderBy: 'CreatedOn',
      dir: 1 // Ascending
    }),
    {
      headers: {
        'Authorization': 'Bearer YOUR_TOKEN'
      }
    }
  );

  const data = await response.json();
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      'https://spaces.nexudus.com/api/billing/coworkerproducts',
      params={
          'page': 1,
          'size': 15,
          'orderBy': 'CreatedOn',
          'dir': 0 // Ascending
      },
      headers={
          'Authorization': 'Bearer YOUR_TOKEN'
      }
  )

  data = response.json()
  ```
</CodeGroup>

### Filtering by CreatedOn

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET \
    "https://spaces.nexudus.com/api/billing/coworkerproducts?CoworkerProduct_CreatedOn=example-value&orderBy=CreatedOn&dir=0" \
    -H "Authorization: Bearer YOUR_TOKEN"
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch(
    'https://spaces.nexudus.com/api/billing/coworkerproducts?' + new URLSearchParams({
      CoworkerProduct_CreatedOn: 'example-value',
      orderBy: 'CreatedOn',
      dir: 1
    }),
    {
      headers: {
        'Authorization': 'Bearer YOUR_TOKEN'
      }
    }
  );

  const data = await response.json();
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      'https://spaces.nexudus.com/api/billing/coworkerproducts',
      params={
          'CoworkerProduct_CreatedOn': 'example-value',
          'orderBy': 'CreatedOn',
          'dir': 0 // Ascending
      },
      headers={
          'Authorization': 'Bearer YOUR_TOKEN'
      }
  )

  data = response.json()
  ```
</CodeGroup>

### Range filters

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET \
    "https://spaces.nexudus.com/api/billing/coworkerproducts?from_CoworkerProduct_UpdatedOn=2025-01-01T00:00&to_CoworkerProduct_UpdatedOn=2025-12-31T23:59&orderBy=UpdatedOn&dir=0" \
    -H "Authorization: Bearer YOUR_TOKEN"
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch(
    'https://spaces.nexudus.com/api/billing/coworkerproducts?' + new URLSearchParams({
      from_CoworkerProduct_UpdatedOn: '2025-01-01T00:00',
      to_CoworkerProduct_UpdatedOn: '2025-12-31T23:59',
      orderBy: 'UpdatedOn',
      dir: 1 // Descending
     }),
    {
      headers: {
        'Authorization': 'Bearer YOUR_TOKEN'
      }
    }
  );

  const data = await response.json();
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      'https://spaces.nexudus.com/api/billing/coworkerproducts',
      params={
          'from_CoworkerProduct_UpdatedOn': '2025-01-01T00:00',
          'to_CoworkerProduct_UpdatedOn': '2025-12-31T23:59',
          'orderBy': 'UpdatedOn',
          'dir': 1 // Descending
      },
      headers={
          'Authorization': 'Bearer YOUR_TOKEN'
      }
  )

  data = response.json()
  ```
</CodeGroup>

## Response

### 200

<ResponseField name="Records" type="CoworkerProduct[]">
  The list of CoworkerProduct records matching the query. See the [Get one CoworkerProduct](/rest-api/billing/get-coworkerproducts-by-id) endpoint for the full list of properties returned for each record.
</ResponseField>

<Warning>
  **Partial records** — The listing endpoint returns a summary representation of each CoworkerProduct. The following fields are **not populated** in the `Records[]` response: `Notes`, `PurchaseOrder`, `ActivateNow`, `InvoiceThisCoworker`, `CreditAmount`, `DiscountAmount`.

  To get all fields, fetch the full record using the [Get one CoworkerProduct](/rest-api/billing/get-coworkerproducts-by-id) endpoint.

  **Important for updates:** When updating a record via `PUT`, always retrieve the full record with a `GET` request first, apply your changes to that complete data, and then send the updated record. Do not use data from a listing response as the base for a `PUT` request, as missing fields may be unintentionally cleared.
</Warning>

<ResponseField name="CurrentPage" type="integer">
  Current page number.
</ResponseField>

<ResponseField name="CurrentPageSize" type="integer">
  Number of records per page.
</ResponseField>

<ResponseField name="CurrentOrderField" type="string">
  The field used for sorting.
</ResponseField>

<ResponseField name="CurrentSortDirection" type="integer">
  The sort direction (`0` = ascending, `1` = descending).
</ResponseField>

<ResponseField name="FirstItem" type="integer">
  Index of the first item on the current page.
</ResponseField>

<ResponseField name="LastItem" type="integer">
  Index of the last item on the current page.
</ResponseField>

<ResponseField name="TotalItems" type="integer">
  Total number of matching records across all pages.
</ResponseField>

<ResponseField name="TotalPages" type="integer">
  Total number of pages.
</ResponseField>

<ResponseField name="HasNextPage" type="boolean">
  Whether there is a next page of results.
</ResponseField>

<ResponseField name="HasPreviousPage" type="boolean">
  Whether there is a previous page of results.
</ResponseField>

```json Example Response theme={null}
{
  "Records": [
    {
      "CoworkerId": 0,
      "CoworkerCoworkerType": null,
      "CoworkerFullName": null,
      "CoworkerCompanyName": null,
      "CoworkerBillingName": null,
      "CoworkerEmail": null,
      "BusinessId": 0,
      "ProductId": 0,
      "ProductName": null,
      "ProductPrice": 0,
      "ProductApplyProRating": null,
      "ProductCurrencyCode": null,
      "OrderNumber": null,
      "Activated": false,
      "Price": null,
      "Quantity": 0,
      "RegularCharge": false,
      "RepeatCycle": 0,
      "RepeatUnit": null,
      "InvoiceOn": null,
      "RepeatFrom": null,
      "RepeatUntil": null,
      "SaleDate": null,
      "DueDate": null,
      "Invoiced": false,
      "InvoicedOn": null,
      "FromTariff": false,
      "BookingUniqueId": null,
      "MrmReminded": false,
      "ApplyProRating": false,
      "CoworkerContractUniqueId": null,
      "ContractDepositUniqueId": null,
      "ContractProductUniqueId": null,
      "CoworkerDeliveryUniqueId": null,
      "ProposalUniqueId": null,
      "CoworkerInvoiceId": null,
      "CoworkerInvoiceNumber": null,
      "CoworkerInvoicePaid": false,
      "TeamsAtTheTimeOfPurchase": null,
      "Id": 87654321,
      "UpdatedOn": "2025-01-15T10:30:00Z",
      "CreatedOn": "2025-01-10T08:00:00Z",
      "UniqueId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "UpdatedBy": "admin@example.com",
      "IsNew": false,
      "SystemId": null,
      "ToStringText": "CoworkerProduct Example",
      "LocalizationDetails": null,
      "CustomFields": null
    }
  ],
  "CurrentPageSize": 15,
  "CurrentPage": 1,
  "CurrentOrderField": "CreatedOn",
  "CurrentSortDirection": 1,
  "FirstItem": 1,
  "HasNextPage": false,
  "HasPreviousPage": false,
  "LastItem": 1,
  "PageNumber": 1,
  "PageSize": 15,
  "TotalItems": 1,
  "TotalPages": 1
}
```
