> ## 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">
  Business Id.
</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">
  Tags.
</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="SyncToSquare" type="boolean">
  Sync to Square.
</ResponseField>

<ResponseField name="CurrencyId" type="integer">
  Currency Id.
</ResponseField>

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

<ResponseField name="TaxRateId" type="integer">
  Tax Rate Id.
</ResponseField>

<ResponseField name="ReducedTaxRateId" type="integer">
  Reduced Tax Rate Id.
</ResponseField>

<ResponseField name="ExemptTaxRateId" type="integer">
  Exempt Tax Rate Id.
</ResponseField>

<ResponseField name="FinancialAccountId" type="integer">
  Financial Account Id.
</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[]">
  Tariffs.
</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">
  Image File Name.
</ResponseField>

<ResponseField name="NewImageUrl" type="string">
  New Image Url.
</ResponseField>

<ResponseField name="ClearImageFile" type="boolean">
  Clear 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,
  "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
}
```
