# Retrieve a product

Operation ID: `getAccountingProduct`

Group: Accounting › Products

[Open in the interactive reference](https://docs.api.lensing.ai/lensing/v1/endpoints/getAccountingProduct)

`GET /accounting/products/{id}`

Read-only: Reads and returns; changes nothing.

Retrieves a product. Use the product's id, not its productNumber or productCode.

The response doesn't include the product's product lines. To get the product lines, use GET accounting/product-lines and filter by productId.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `Api-Version` | header | string · v1 | yes | The API version this request targets, named by its public identifier. Required on every request; omitting it, or naming a version this company does not have, is answered with 400. This document describes version `v1`. |
| `id` | path | string | yes | The unique identifier of the product you want to retrieve. |

## Response

`200` Success

Under `data` (getAccountingProductOutput):

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | yes | The unique identifier for the product. |
| `productName` | string | yes | The product's display name. |
| `productCode` | string | yes | The product's code, unique within the tenant. |
| `productNumber` | string | no | The product number, assigned by the system and unique within the tenant. Absent while none has been assigned. |
| `description` | string | no | A description of the product shown to customers. |
| `internalDescription` | string | no | A description of the product for internal use, not shown to customers. |
| `crmProductId` | string | no | The product's identifier in an external CRM system. |
| `effectiveStartDate` | date | yes | The date the product becomes available. Format YYYY-MM-DD. |
| `effectiveEndDate` | date | no | The date the product is no longer available. Format YYYY-MM-DD. Absent for a product with no end date. |
| `productFamily` | string | no | The product family. Possible values: 'software', 'services', 'physicalProducts'. |
| `productType` | string | no | The product type. Possible values: 'sub', 'termLicense', 'support', 'professionalServices', 'training', 'usage', 'billableTravelExpense', 'bundle', 'hardwareConsumables', 'billablePassThrough', 'merchandise', 'shipping'. |
| `productStatus` | string | no | The product's availability status, computed by the system. Possible values: 'draft', 'available', 'unavailable', 'incomplete'. It is derived from the product's lines, pricing and effective dates and cannot be set directly. |
| `isInventory` | boolean | no | Whether the product is tracked as inventory. |
| `itemIds` | array<string> | no | The inventory items linked to this product. Used only when isInventory is true. Absent when the product has none. See id on GET inventory/items/:id. |
| `createdDate` | date-time | no | The date and time the product record was created, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. |
| `lastModifiedDate` | date-time | yes | The date and time the product record last changed, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. |
| `externalIdentifiers` | array<object> | no | External identifiers owned by other systems, at most one per fieldName. Absent when the product has none. This collection is read-only. Create and update do not accept it. |
| `externalIdentifiers[].fieldName` | string | yes | The configured key of the external identifier, a camelCase slug rather than the display label. It must match an active external-identifier configuration for products. |
| `externalIdentifiers[].value` | string | yes | The identifier's value in the source system. |
| `externalIdentifiers[].externalUrl` | string | no | An absolute http or https link to the object in the source system. Absent when none is set. |

```json
{
  "data": {
    "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "productName": "<productName>",
    "productCode": "<productCode>",
    "productNumber": "<productNumber>",
    "description": "<description>",
    "internalDescription": "<internalDescription>",
    "crmProductId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "effectiveStartDate": "2026-01-15",
    "effectiveEndDate": "2026-01-15",
    "productFamily": "<productFamily>",
    "productType": "<productType>",
    "productStatus": "<productStatus>",
    "isInventory": true,
    "itemIds": [
      "<itemIds>"
    ],
    "createdDate": "2026-01-15T09:30:00.000Z",
    "lastModifiedDate": "2026-01-15T09:30:00.000Z",
    "externalIdentifiers": [
      {
        "fieldName": "<fieldName>",
        "value": "<value>",
        "externalUrl": "<externalUrl>"
      }
    ]
  },
  "diagnostics": [
    {
      "code": "<code>",
      "message": "<message>",
      "severity": "error",
      "path": [
        "<path>"
      ],
      "details": "<details>"
    }
  ]
}
```

## Errors

| Code | Status |
| --- | --- |
| `INVALID_ID` | 400 |
| `NOT_FOUND` | 400 |

## Statuses

- `400` — Invalid request or business failure. Codes: INVALID_ID, NOT_FOUND
- `401` — The request carries no valid access token.
- `403` — Not authorized
- `404` — Not found
- `429` — Too many requests from this client address. The response has no body and no `Retry-After` header.
- `500` — Internal server error
