> ## 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.

# Get one Product

> Retrieve a single Product record by its Id.

A **Product** represents an item that can be sold to customers. Products can be sold via contracts (`ContractProduct` entity), added to bookings (`BookingProduct` entity), or purchased directly (`CoworkerProduct` entity).

Products support both one-off sales and recurring charges. Recurring charges can be set to daily, weekly, monthly, or yearly frequencies, or charged every time a contract is invoiced. For invoice-linked recurring charges, prefer using `ContractProduct` to associate the sale directly with a specific contract rather than relying on the customer's `MainContract`.

Use `AvailableAs` to control whether a product can be sold as a one-off purchase, a recurring charge, or both. The `SystemProductType` field categorises the product (e.g. day pass, credit bundle, booking product, stationery, or other).

Products can optionally track stock levels, be restricted to specific pricing plans (tariffs), and be limited to members or contacts only.

## 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 **`Product-Read`** role.
</Note>

## Path Parameters

<ParamField path="id" type="integer" required>
  The Id of the Product record to retrieve.
</ParamField>

## Code Examples

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET \
    "https://spaces.nexudus.com/api/billing/products/87654321" \
    -H "Authorization: Bearer YOUR_TOKEN"
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch(
    'https://spaces.nexudus.com/api/billing/products/87654321',
    {
      headers: {
        'Authorization': 'Bearer YOUR_TOKEN'
      }
    }
  );

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

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

  response = requests.get(
      'https://spaces.nexudus.com/api/billing/products/87654321',
      headers={
          'Authorization': 'Bearer YOUR_TOKEN'
      }
  )

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

## Response

### 200

<ResponseField name="BusinessId" type="integer">
  ID of the business linked to this record.
</ResponseField>

<ResponseField name="BusinessName" type="string">
  Business name.
</ResponseField>

<ResponseField name="Name" type="string">
  Product name.
</ResponseField>

<ResponseField name="SystemProductType" type="integer">
  Category of the product: DayPass, CreditBundle, Stationery, BookingFeature, BookingProducts, or Other. See `eProductType` enum values: `0` = None, `1` = DayPass, `2` = CreditBundle, `3` = Stationery, `4` = BookingFeature, `5` = BookingProducts, `99` = Other.
</ResponseField>

<ResponseField name="Description" type="string">
  Product description.
</ResponseField>

<ResponseField name="InvoiceLineDisplayAs" type="string">
  Custom text shown on the invoice line instead of the product name.
</ResponseField>

<ResponseField name="Sku" type="string">
  SKU code.
</ResponseField>

<ResponseField name="Tags" type="string">
  Comma-separated tags for categorising and filtering.
</ResponseField>

<ResponseField name="DisplayOrder" type="integer">
  Display order.
</ResponseField>

<ResponseField name="Price" type="number">
  Product price.
</ResponseField>

<ResponseField name="Visible" type="boolean">
  Whether the product is visible to customers on the members portal and mobile app.
</ResponseField>

<ResponseField name="VisibleInKiosk" type="boolean">
  Whether the product is visible to customers in the NexKiosk app.
</ResponseField>

<ResponseField name="AvailableToAi" type="boolean">
  Whether this product is available to any AI channels (Email, Chat or WhatsApp) for recommendations for day passes;.
</ResponseField>

<ResponseField name="NotesForAi" type="string">
  Additional notes about the product that are included in AI channel recommendations and responses to provide more context to customers.
</ResponseField>

<ResponseField name="ShowPriceForAi" type="boolean">
  Whether to show the price of this product in AI channel recommendations and responses based on users' budget preferences.
</ResponseField>

<ResponseField name="PriceForAi" type="number">
  Override price to show in AI channel recommendations and responses based on users' budget preferences (if not set, the regular Price value is used).
</ResponseField>

<ResponseField name="SyncToSquare" type="boolean">
  Sync to Square Point of Sale.
</ResponseField>

<ResponseField name="CurrencyId" type="integer">
  ID of the currency linked to this record.
</ResponseField>

<ResponseField name="CurrencyCode" type="string">
  Currency code.
</ResponseField>

<ResponseField name="TaxRateId" type="integer">
  ID of the tax rate linked to this record.
</ResponseField>

<ResponseField name="ReducedTaxRateId" type="integer">
  ID of the reduced tax rate linked to this record.
</ResponseField>

<ResponseField name="ExemptTaxRateId" type="integer">
  ID of the exempt tax rate linked to this record.
</ResponseField>

<ResponseField name="FinancialAccountId" type="integer">
  ID of the financial account linked to this record.
</ResponseField>

<ResponseField name="AvailableAs" type="integer">
  Controls whether the product can be sold as a one-off purchase, a recurring charge, or both (RecurrentOrOneOff, OnlyRecurrent, OnlyOneOff). See `eRecurrentProductOptions` enum values: `0` = None, `1` = RecurrentOrOneOff, `2` = OnlyRecurrent, `3` = OnlyOneOff.
</ResponseField>

<ResponseField name="OnlyForContacts" type="boolean">
  Restrict purchase to contacts (customers without an active contract).
</ResponseField>

<ResponseField name="OnlyForMembers" type="boolean">
  Restrict purchase to customers with an active contract (members).
</ResponseField>

<ResponseField name="Tariffs" type="integer[]">
  List of tariffs linked to this record.
</ResponseField>

<ResponseField name="Archived" type="boolean">
  Whether the product is archived. Archived products cannot be sold but existing charges remain active.
</ResponseField>

<ResponseField name="Starred" type="boolean">
  Mark the product as featured or highlighted.
</ResponseField>

<ResponseField name="TrackStock" type="boolean">
  Enable stock tracking for this product. When enabled, each sale reduces the stock count.
</ResponseField>

<ResponseField name="AllowNegativeStock" type="boolean">
  Allow sales to continue even when stock reaches zero.
</ResponseField>

<ResponseField name="CurrentStock" type="integer">
  Current stock level.
</ResponseField>

<ResponseField name="StockAlertLevel" type="integer">
  Stock level at which a low-stock alert is triggered.
</ResponseField>

<ResponseField name="ApplyProRating" type="boolean">
  Whether to pro-rate the price when the product is added or removed part-way through a billing period.
</ResponseField>

<ResponseField name="ImageFileName" type="string">
  Current file name of the image (read-only; upload via the corresponding URL field).
</ResponseField>

<ResponseField name="NewImageUrl" type="string">
  URL of a new file to upload as the image.
</ResponseField>

<ResponseField name="ClearImageFile" type="boolean">
  Set to true to remove the current image file.
</ResponseField>

<ResponseField name="InvoiceCoworker" type="boolean">
  Whether to invoice the customer directly rather than their company or team.
</ResponseField>

<ResponseField name="SyncToNexKiosk" type="boolean">
  Sync to NexKiosk.
</ResponseField>

<ResponseField name="CreateDeliveryWhenPurchased" type="boolean">
  Automatically create a delivery record for the customer when this product is purchased.
</ResponseField>

<ResponseField name="Id" type="integer">
  Unique record identifier.
</ResponseField>

<ResponseField name="UniqueId" type="string">
  UUID of the record.
</ResponseField>

<ResponseField name="CreatedOn" type="string">
  Date and time the record was created (ISO 8601).
</ResponseField>

<ResponseField name="UpdatedOn" type="string">
  Date and time the record was last updated (ISO 8601).
</ResponseField>

<ResponseField name="UpdatedBy" type="string">
  Email of the user who last updated this record.
</ResponseField>

<ResponseField name="IsNew" type="boolean">
  Whether the record was recently created.
</ResponseField>

<ResponseField name="SystemId" type="string">
  External system identifier.
</ResponseField>

```json Example Response theme={null}
{
  "BusinessId": 0,
  "BusinessName": null,
  "Name": "",
  "SystemProductType": 0,
  "Description": "",
  "InvoiceLineDisplayAs": null,
  "Sku": null,
  "Tags": null,
  "DisplayOrder": 0,
  "Price": 0,
  "Visible": false,
  "VisibleInKiosk": false,
  "AvailableToAi": false,
  "NotesForAi": null,
  "ShowPriceForAi": false,
  "PriceForAi": null,
  "SyncToSquare": false,
  "CurrencyId": 0,
  "CurrencyCode": null,
  "TaxRateId": null,
  "ReducedTaxRateId": null,
  "ExemptTaxRateId": null,
  "FinancialAccountId": null,
  "AvailableAs": 0,
  "OnlyForContacts": false,
  "OnlyForMembers": false,
  "Tariffs": [],
  "Archived": false,
  "Starred": false,
  "TrackStock": false,
  "AllowNegativeStock": false,
  "CurrentStock": null,
  "StockAlertLevel": null,
  "ApplyProRating": false,
  "ImageFileName": null,
  "NewImageUrl": null,
  "ClearImageFile": null,
  "InvoiceCoworker": false,
  "SyncToNexKiosk": false,
  "CreateDeliveryWhenPurchased": false,
  "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": "Product Example",
  "LocalizationDetails": null,
  "CustomFields": null
}
```
